将XML解析为数据表

时间:2018-10-11 11:16:29

标签: c# xml linq

对此有很多麻烦:(

基于之前的问题here,我现在可以从XML文件中获取所有价格,但是如果我想获取startdate(在整个文档中会有所变化)和价格(将会在整个文档中更改)并将其放在数据表中。从上一个问题中可以看到,我试图将其放入datatable中,但是如果我集成了提供的解决方案,那么对于XML文件中的行数,我将获得相同的FormalName和价格(大约700)。这是我正在处理的代码。

string[] arr = new string[3];
var dr = from n in prices.Descendants("COLUMN")
         select new string[]
         {
             arr[0] = n.Attribute("FormalName").Value
         };

foreach (var item in dr)
{
    dt.Rows.Add(item[0]);
}

这是上一个问题中提供的解决方案,我需要将其集成到我的解决方案中。

var result = from c in prices.Descendants("COLUMN")
             where c.Attribute("FormalName")?.Value == "Price"
             select c.Value;

我确实考虑过对要提取的每个部分使用linq语句,这样就将startdate和price组合在一起,然后如何将它们组合在一起,但我不能确定订单的顺序?

更新:

示例XML

<myPrices>
  <Prices Date="10-Oct-18" ReportName="myReport">
    <Record RecordId="1">
      <COLUMN DisplayName="Start Date" FormalName="startdate">10.10.2018</COLUMN>
      <COLUMN DisplayName="End Date" FormalName="Price">10</COLUMN>
    </Record>
    <Record RecordId="2">
      <COLUMN DisplayName="Start Date" FormalName="startdate">11.10.2018</COLUMN>
      <COLUMN DisplayName="End Date" FormalName="Price">20</COLUMN>
    </Record>
  </Prices>
</myPrices>

数据表

Table example

2 个答案:

答案 0 :(得分:1)

您可以通过多种方式进行操作。 Linq是一种方法,但是对于一个简单的示例,请尝试以下操作:

@Bean
@ConditionalOnProperty(value = "property", havingValue = "value", matchIfMissing = true)
public MyBean myBean() ...

您可以使用XPath模式过滤节点。

答案 1 :(得分:0)

我首先用所需的列创建一个DataTable,然后通过Linq-to-XML填充它。

您可以使用Select查询创建代表每一行的对象,然后使用标准方法为每个项目创建DataRows ...

class Quest
{
    public string Answer1;
    public string Answer2;
    public string Answer3;
    public string Answer4;
}

public static void Main()
{
    var doc = XDocument.Load("filename.xml");

    var rows = doc.Descendants("QuestId").Select(el => new Quest
    {
        Answer1 = el.Element("Answer1").Value,
        Answer2 = el.Element("Answer2").Value,
        Answer3 = el.Element("Answer3").Value,
        Answer4 = el.Element("Answer4").Value,
    });

    // iterate over the rows and add to DataTable ...

}