首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Linq:子体不会返回结果

Linq:子体不会返回结果
EN

Stack Overflow用户
提问于 2018-06-03 00:57:52
回答 2查看 51关注 0票数 0

我有这个simpel xml文件:

代码语言:javascript
复制
<Document xmlns="urn:com.place:dps-if-gfc-request.001">
    <ReqHdr>
        <MsgId>IE1611240000000100000001</MsgId>
        <CreDtTm>2016-11-24T10:14:33.327Z</CreDtTm>
        <AppInstanceId>DPSH</AppInstanceId>
        <TxId>FirstTxId</TxId>
    </ReqHdr>
    <ReqTxInf>
        <PmtId>
            <TxId>SecondTxId</TxId>
        </PmtId>
        <MsgTyp>Request</MsgTyp>
        <CtgyPurp>
            <Prtry>ECRI</Prtry>
        </CtgyPurp>
    </ReqTxInf>
</Document>

我正在尝试获取第一个元素的内容:

代码语言:javascript
复制
var xml = XElement.Load (@"myLovelyXmlFile.xml");
Console.Writeline(xml.Descendants("TxId").First().Value);

预期结果为FirstTxId,但没有返回任何内容。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-03 01:01:35

您得不到结果,因为Document标记中有一个名称空间。

要解决此问题,请声明一个名称空间并将其“添加”到元素的名称中:

代码语言:javascript
复制
XNamespace ns = "urn:com.dovetailsystems:dps-if-gfc-request.001";
Console.WriteLine(xml.Descendants(ns + "TxId").First().Value);

这段代码将把"FirstTxId“打印到控制台。

您还可以临时删除名称空间(删除后,不要保存文档或在保存之前再次添加):

代码语言:javascript
复制
public static void RemoveNamespace(this XElement container)
{
    container.DescendantsAndSelf().Attributes().Where(x => x.IsNamespaceDeclaration).Remove();
    foreach (var elem in container.DescendantsAndSelf())
        elem.Name = elem.Name.LocalName;
}

此扩展方法的用法:xml.Root.RemoveNamespace();

删除后,您的原始代码应该可以正常工作。

不幸的是,似乎没有办法忽略名称空间;因此,无论是添加还是删除它都必须做到这一点……

票数 2
EN

Stack Overflow用户

发布于 2018-06-03 01:07:28

此代码可帮助您:

代码语言:javascript
复制
XmlDocument document = new XmlDocument();
document.Load("YOUR_PATH");
var x= document.GetElementsByTagName("TxId").Item(0);

document.GetElementsByTagName获取您只想要第一个子节点的节点集合。因此,我们选择项(0)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50659180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档