Linq:后代不会回报结果

时间:2018-06-02 16:57:52

标签: linq-to-xml

我有这个simpel xml文件:

<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>

我试图了解第一个元素的内容:

var xml = XElement.Load (@"myLovelyXmlFile.xml");
Console.Writeline(xml.Descendants("TxId").First().Value);

期望结果为 FirstTxId ,但没有任何回复。

2 个答案:

答案 0 :(得分:2)

您没有收到结果,因为Document代码中有一个名称空间。

要解决此问题,请声明一个命名空间,然后添加&#34;添加&#34;它是元素的名称:

XNamespace ns = "urn:com.dovetailsystems:dps-if-gfc-request.001";
Console.WriteLine(xml.Descendants(ns + "TxId").First().Value);

此代码将打印&#34; FirstTxId&#34;到控制台。

您还可以暂时删除命名空间(删除后,不保存文档或在保存之前重新添加):

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();

删除后,原始代码应按预期工作。

不幸的是,似乎没有办法忽略命名空间;所以无论是添加还是删除它都必须要做到这一点......

答案 1 :(得分:1)

此代码可以帮助您:

XmlDocument document = new XmlDocument();
document.Load("YOUR_PATH");
var x= document.GetElementsByTagName("TxId").Item(0);

document.GetElementsByTagName获取您只想要第一个子节点的节点集合。所以我们选择Item(0)。