首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#读取XML多次嵌套

C#读取XML多次嵌套
EN

Stack Overflow用户
提问于 2015-07-09 18:10:16
回答 1查看 1K关注 0票数 0

我有一个从报表生成的原始XML文件。XML的格式非常复杂。我所要做的工作的目标是遍历这个xml,并在每个ObjectName节点中获取<FormattedAreaPair Level="2" Type="Details">FormattedValue的值。

代码语言:javascript
复制
<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:-没有找到数据

代码语言:javascript
复制
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:

代码语言:javascript
复制
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;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-09 18:44:41

有什么问题吗?很简单!

代码语言:javascript
复制
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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31325120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档