使用Linq to XML读取XML文件

5
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Report SYSTEM "https://abc.mycompany.com/abc/processingreports/processeddtd/abcd_1_8.dtd">
<Report Name="Daily TRANSACTIONS"
        Version="1.8"
        xmlns="https://abc.mycompany.com/abc/processingreports/processeddtd/abcd_1_8.dtd"
        OrgID="ABC_PQR" StartDate="2011-03-10T00:00:00+00:00" EndDate="2011-03-11T00:00:00+00:00">
    <Requests>
        <Request ID="2"
                 Date="2011-03-10T00:21:14+00:00"
                 OrderNumber="1">
            <BillTo>
                <FirstName />
            </BillTo>
            <LineItems>
                <LineItem Number="0">
                    <Quantity />
                </LineItem>
            </LineItems>
        </Request>
        <Request ID="2"
                 Date="2011-03-10T00:21:14+00:00"
                 OrderNumber="1">
                 TransactionNumber="389958330911111">
            <BillTo>
                <FirstName>A</FirstName>
            </BillTo>
            <LineItems>
                <LineItem Number="0">
                    <Quantity>1</Quantity>
                </LineItem>
            </LineItems>
            <UniqueData>
                <UniqueNumber>11111111111111111111111111111</UniqueNumber>
            </UniqueData></Request></Requests></Report>

在上述XML文件中,我只想提取OrderNumber和UniqueNumber。 OrderNumber="1" 11111111111111111111111111111

有什么想法、建议可以提取这些细节吗?

我可以从上述xml文件中选择元素,但是UniqueNumber与OrderNumber没有关联。

我正在寻找以下内容(忽略UniqueNumber不存在的行) OrderNumber - 关联的UniqueNumber

更新 在“requiredElements”中,我期望有两列OrderNumber和UniqueNumber,并且它们之间相互关联,例如1和11111等

 #region FileOpen with UTF8 Encoding

 TextReader sr = new StreamReader(cFileName, Encoding.UTF8);
 XDocument reportfile = XDocument.Load(sr, LoadOptions.SetBaseUri);
 XElement xd = XElement.Parse(reportfile.ToString());
 sr.Close();


 #endregion

 XNamespace ns = xd.Attribute("xmlns").Value;

 var requiredElements = (from resultquery in reportfile.Descendants()
                          select new
                          {
                             OrderNumber = resultquery.Attribute("OrderNumber"),
                             UniqueNumber= (string)resultquery.Element(AddNameSpace(ns, "UniqueNumber")),
                          }
                      );

1
你的问题并不是很清楚...你所说的“UniqueNumber未与OrderNumber关联”是什么意思? - Jon Skeet
在“requiredElements”中,我期望有两列“OrderNumber”和“UniqueNumber”,并且它们彼此关联的值为1和11111等。 - swapneel
1个回答

10

这里是一些示例:

    XDocument doc = XDocument.Load(@"file.xml");
    XNamespace df = doc.Root.Name.Namespace;
    var results = from request in doc.Descendants(df + "Request")
                  where request.Elements(df + "UniqueData").Elements(df + "UniqueNumber").Any()
                  select new
                  {
                      ordNumber = (int)request.Attribute("OrderNumber"),
                      uniqueNumber = (decimal)request.Element(df + "UniqueData").Element(df + "UniqueNumber")
                  };
    foreach (var result in results)
    {
        Console.WriteLine("{0}-{1}", result.ordNumber, result.uniqueNumber);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接