C#读取XML多个嵌套

时间:2015-07-09 18:10:16

标签: c# xml winforms

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

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

使用System.XML: - 找不到数据

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

1 个答案:

答案 0 :(得分:1)

有什么问题?这很简单!

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