C# 从不同树中检索2个元素的XML

C# 从不同树中检索2个元素的XML,c#,xml,linq,C#,Xml,Linq,我的XML文件示例如下所示:- <table> <columns> <column> <area> <identifier>E31000040</identifier> <label>Gtr Manchester Fire</label> <altLabel>Gtr Manchester Fire</altL

我的XML文件示例如下所示:-

<table>  
  <columns>
    <column>
      <area>
        <identifier>E31000040</identifier>
        <label>Gtr Manchester Fire</label>
        <altLabel>Gtr Manchester Fire</altLabel>
        <isSummary>false</isSummary>
      </area>
      <metricType>
        <identifier>948</identifier>
        <label>Accidental dwelling fires</label>
        <altLabel>Accidental dwelling fires</altLabel>
        <isSummary>false</isSummary>
      </metricType>
      <period>
        <identifier>fq_Q1_2007_08</identifier>
        <label>2007/08 Q1</label>
        <altLabel>2007/08 Q1</altLabel>
        <isSummary>false</isSummary>
      </period>
      <valueType>
        <identifier>raw</identifier>
        <label>Raw value</label>
        <isSummary>false</isSummary>
      </valueType>
    </column>
    <column>
      <area>
        <identifier>E31000040</identifier>
        <label>Gtr Manchester Fire</label>
        <altLabel>Gtr Manchester Fire</altLabel>
        <isSummary>false</isSummary>
      </area>
      <metricType>
        <identifier>948</identifier>
        <label>Accidental dwelling fires</label>
        <altLabel>Accidental dwelling fires</altLabel>
        <isSummary>false</isSummary>
      </metricType>
      <period>
        <identifier>fq_Q2_2007_08</identifier>
        <label>2007/08 Q2</label>
        <altLabel>2007/08 Q2</altLabel>
        <isSummary>false</isSummary>
      </period>
      <valueType>
        <identifier>raw</identifier>
        <label>Raw value</label>
        <isSummary>false</isSummary>
      </valueType>
    </column>
  <rows>
    <row>
      <values>
        <value>
          <source>732.0</source>
          <value>732.0</value>
          <formatted>732</formatted>
          <format>#,##0</format>
          <publicationStatus>Published</publicationStatus>
        </value>
        <value>
          <source>659.0</source>
          <value>659.0</value>
          <formatted>659</formatted>
          <format>#,##0</format>
          <publicationStatus>Published</publicationStatus>
        </value>
      </values>
    </row>
  </rows>
</table>

E31000040
曼彻斯特火灾全球技术法规
曼彻斯特火灾全球技术法规
假的
948
住宅意外火灾
住宅意外火灾
假的
fq_Q1_2007_08
2007/08第一季度
2007/08第一季度
假的
未经加工的
原始价值
假的
E31000040
曼彻斯特火灾全球技术法规
曼彻斯特火灾全球技术法规
假的
948
住宅意外火灾
住宅意外火灾
假的
fq_Q2_2007_08
2007/08第二季度
2007/08第二季度
假的
未经加工的
原始价值
假的
732
732
732
#,##0
出版
659
659
659
#,##0
出版
首先,我想添加到一个网格,并最终保存到一个sql数据库,每个列周期/标签,以及相应的值。 我尝试了以下代码的各种变体,所有这些变体都与周期和值不匹配

XDocument xd = XDocument.Load(xml);

List<Results> period = new List<Results>();

var columnnodes = xd.Element("table")
                    .Elements("columns")
                    .Elements("column")
                    .Elements("period");

var rownodes = xd.Element("table")
                 .Elements("rows")
                 .Elements("row")
                 .Elements("values")
                 .Elements("value");

foreach (XElement ele in columnnodes)
{
    Results newResult = new Results();
    newResult.period = (string)ele.Element("label");

    /*newResult.value = (int)xd.Element("table")
                             .Elements("rows")
                             .Elements("row")
                             .Elements("values")
                             .Elements("value")
                             .Elements("Formatted");

    period.Add(newResult);*/

    foreach (XElement ele2 in rownodes)
    {
        newResult.value = (int)ele2.Element("formatted");
    }

    period.Add(newResult);
}

gridResults.DataSource = period;
gridResults.DataBind();
XDocument xd=XDocument.Load(xml);
列表周期=新列表();
var columnnodes=xd.Element(“表”)
.要素(“列”)
.要素(“列”)
.要素(“期间”);
var rownodes=xd.Element(“表”)
.元素(“行”)
.要素(“行”)
.要素(“价值”)
.要素(“价值”);
foreach(列节点中的元素元素)
{
结果newResult=新结果();
newResult.period=(字符串)元素(“标签”);
/*newResult.value=(int)xd.Element(“表”)
.元素(“行”)
.要素(“行”)
.要素(“价值”)
.要素(“价值”)
.元素(“格式化”);
期间。添加(新结果)*/
foreach(行节点中的XElement ele2)
{
newResult.value=(int)ele2.Element(“格式化”);
}
期间。添加(新结果);
}
gridResults.DataSource=期间;
gridResults.DataBind();
关于如何使它们与数据网格对齐的任何线索,类似于:-

  • 周期值
  • 2007/08年第一季度732
  • 2007/08第2季度659

  • 您只需在两个单独的列表中提取句点和值:

    var periods = from p in xmlDoc.Descendants("period")
                  select p.Element("label").Value;
    
    var values = from v in xmlDoc.Descendants("formatted")
                 select v.Value;
    
    然后把它们放在一起:

    var results = periods.Zip(values, (p, v) => new { Period = p, Value = v });
    
    要生成所需的结果集,请执行以下操作:

    [0] = { Period = "2007/08 Q1", Value = "732" }
    [1] = { Period = "2007/08 Q2", Value = "659" }
    

    我发现您的XML文件有两个问题,第一个
    标记未关闭,它必须位于两个
    元素之后,第二个也是重要的一个标记位于
    树中,您又有了一个
    元素(您要获取它),这肯定会产生问题,因为如果要查找
    值的后代
    ,则也会考虑此项,这将导致意外结果

    因此,我已将您的内部元素替换为列名称
    amount
    ,您可以为其指定任何有意义的名称,并相应地更改查询:-

    var period = xdoc.Descendants("period")
               .Select((x,index) => new
               {
                  Period = (string)x.Element("label"),
                  Value = x.Document.Root.Descendants("value")
                           .Where((v,i) => i == index)
                           .Select(z => (string)z.Element("amount")).FirstOrDefault()
               });
    

    如您所见,我正在获取期间&,分别位于
    &
    树的同一索引中。

    您能提供一个从OP的样本xml生成的样本数据集,并将其绑定到网格吗?添加了一个输出/表的示例,抱歉,它是一个列表格式@Porkster-你有机会检查我的答案吗?谢谢Rahul。我在缩短示例时意外删除了结尾。我知道有两个嵌套的“值”,但是我不知道如何更改其中一个,所以非常感谢。由于数据来自外部源,因此我对该数据的创建没有任何输入。