c#读取XML多重嵌套

本文关键字:嵌套 XML 读取 | 更新日期: 2023-09-27 18:01:49

我有一个从报告生成的原始XML文件。XML的格式非常复杂。我试图做的目标是通过这个xml并在<FormattedAreaPair Level="2" Type="Details">的每个节点中获得ObjectNameFormattedValue的值:

<FormattedReport xmlns="urn:crystal-reports:schemas" 
                 xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
  <FormattedAreaPair Level="0" Type="Report">
    <FormattedAreaPair Level="1" Type="Group">
      <FormattedAreaPair Level="2" Type="Details">
        <FormattedArea Type="Details">
          <FormattedSections>
            <FormattedSection SectionNumber="0">
              <FormattedReportObjects>
                <FormattedReportObject xsi:type="CTFormattedField"
                                       Type="xsd:string" 
                                       FieldName="{ado.agent_extension}">
                  <ObjectName>Field2</ObjectName> 
                  <FormattedValue>3531</FormattedValue> 
                  <Value>3531</Value> 
                </FormattedReportObject>
                <FormattedReportObject xsi:type="CTFormattedField"
                                       Type="xsd:string" 
                                       FieldName="{ado.agent_state}">
                  <ObjectName>Field4</ObjectName> 
                  <FormattedValue>Logged-in</FormattedValue> 
                  <Value>Logged-in</Value> 
                </FormattedReportObject>
                <FormattedReportObject xsi:type="CTFormattedField"
                                       Type="xsd:short" 
                                       FieldName="{ado.reason_code}">
                  <ObjectName>Field5</ObjectName> 
                  <FormattedValue>0</FormattedValue> 
                  <Value>0.00</Value> 
                </FormattedReportObject>
                <FormattedReportObject xsi:type="CTFormattedField"
                                       Type="xsd:string" 
                                       FieldName="{@tf_duration}">
                  <ObjectName>Field7</ObjectName> 
                  <FormattedValue>0:00:00</FormattedValue> 
                  <Value>0:00:00</Value> 
                </FormattedReportObject>
                <FormattedReportObject xsi:type="CTFormattedField"
                                       Type="xsd:string" 
                                       FieldName="{@tf_Agent_ID}">
                  <ObjectName>TemplateField11</ObjectName> 
                  <FormattedValue>Users_Name</FormattedValue> 
                  <Value>Users_Name</Value> 
                </FormattedReportObject>
                <FormattedReportObject xsi:type="CTFormattedField"
                                       Type="xsd:timeInstant" 
                                       FieldName="{@tf_Transition_Time}">
                  <ObjectName>TemplateField21</ObjectName> 
                  <FormattedValue>6/1/2015 6:43:31AM</FormattedValue> 
                  <Value>2015-06-01T06:43:31</Value> 
                </FormattedReportObject>
              </FormattedReportObjects>
            </FormattedSection>
          </FormattedSections>
        </FormattedArea>
      </FormattedAreaPair>

我已经尝试了几种不同的方法(我对阅读XML相当陌生)。

using System.XML: - No data found

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"C:'TEST'Reports'Test.xml");
XmlNode node = xmlDoc.DocumentElement.FirstChild;
XmlNodeList lstFields = node.ChildNodes;
for(int i = 0; i <lstFields.Count; i++)
{
    //look for Node
    if (lstFields[i].Name == "FormattedSections")
    {
        XmlNodeList lstCrap = lstFields[i].ChildNodes;
        for (int j = 0; j < lstCrap.Count; j++)
        {
            txtTest.Text += lstCrap[j].InnerText + "'n";
        }
    }
}
使用system.xml.linq:

private string pullValue (string productID)
    {
        XDocument xdoc = XDocument.Load(@"C:'TEST'Reports'Test.xml");
        var detailsTest = xdoc
            .Descendants("FormattedReportObjects")
            .Where(extension => extension.Descendants("FormattedReportObject")
            .Any(number => (string)number.Attribute("Value")
            == productID)).FirstOrDefault();
        return (string)detailsTest;
    }

c#读取XML多重嵌套

有什么问题?很简单!

XElement report = XElement.Load("file.xml");
XNamespace ns = "urn:crystal-reports:schemas";
var formattedAreaPair = report
    .Descendants(ns + "FormattedAreaPair")
    .Where(elem => elem.Attribute("Level").Value == "2" && elem.Attribute("Type").Value == "Details")
    .First();
foreach (var elem in formattedAreaPair.Descendants(ns + "FormattedReportObject"))
{
    Console.WriteLine(elem.Element(ns + "ObjectName").Value);
    Console.WriteLine(elem.Element(ns + "FormattedValue").Value);
    Console.WriteLine();
}
相关文章: