XElement.Decendents.First没有找到xml字段

时间:2016-11-24 15:42:02

标签: c# linq xelement

我正在尝试读取XML文件并找到字段的值。

我正在阅读文件“MyMessage.txt”:

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:com.company:request.001">
    <ReqHdr>
        <AppInstanceId>AAAA</AppInstanceId>
    </ReqHdr>
    <ReqTxInf>
        <PmtId>
            <TxId>123456</TxId>
        </PmtId>
        <MsgTyp>REQUEST</MsgTyp>
    </ReqTxInf>
</Document>

以下是代码:

// Read XElement from file
element = XElement.Parse(System.IO.File.ReadAllText(
    System.IO.Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "MyMessage.txt")));
try
{
    Console.WriteLine(element);
    Console.WriteLine("TxId is:" + element.Descendants("TxId").First().Value);
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    Console.WriteLine(e.StackTrace);
}

正确读取文件并将其写入控制台,但搜索TxId失败。

这次尝试重复此操作,在代码中创建文件,相同的代码找到TxId:

// Create XEleemnt in code
XNamespace ns = "urn:com.company:request.001";
XElement element = new XElement(ns + "Document",
    new XElement("ReqHdr", 
        new XElement("AppInstanceId", "AAAA")),
    new XElement("ReqTxInf",
        new XElement("PmtId", 
            new XElement("TxId", "123456")),
        new XElement("MsgTyp", "request")));

try
{
    Console.WriteLine(element);
    Console.WriteLine();
    Console.WriteLine("TxId is:" + element.Descendants("TxId").First().Value);
    Console.WriteLine();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    Console.WriteLine(e.StackTrace);
}

解决
读取字段的行已更改为包含名称空间

Console.WriteLine("TxId is:" + element.Descendants(element.Name.Namespace + "TxId").First().Value);

1 个答案:

答案 0 :(得分:2)

您正在寻找没有名称空间中名为TxId的元素 - 但您的元素隐含在"urn:com.company:request.001"名称空间中,它继承自其祖先。

所以你需要:

element.Descendants(ns + "TxId").First()