簡體   English   中英

使用Linq to XML解析帶有單獨的元數據元素的XML文件

[英]Using Linq to XML to parse XML file with separate metadata element

我有一個嘗試使用C#Linq解析為XML的以下格式的xml文件。 問題在於它具有此單獨的元數據元素,這是唯一標識以下值的東西。 有什么好方法嗎? 我無權更改此文件的格式。

<?xml version="1.0" encoding="utf-8?>
  <dataset xmlns="http://developer.cognos.com/schemas/xmldata/1/" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
    <metadata>
      <item name="Address Line 1" type="xs:string" length="512"/>
      <item name="Address Line 2" type="xs:string" length="512"/>
      <item name="Date Of Birth" type="xs:dateTime"/>
    </metadata>
    <data>
       <row>
         <value>123 Main St</value>
         <value xs:nil="true" />
         <value>1970-01-01T00:00:00</value>
       </row>
       <row>
         <value>125 Main St</value>
         <value>Apt 1</value>
         <value>1980-01-01T00:00:00</value>
       </row>
    </data>
</dataset>

實際文件在每行中都有大約30個項目和相應的value元素,並且遵循此格式的數百個row元素。 我基本上是在尋找將元數據與值匹配的最佳方法。 如果Linq to XML不是實現此目的的最佳方法,那么我願意接受其他與C#和.NET 4.5一起使用的建議。

我嘗試僅收集列表中的元數據項並使用索引將它們與值匹配,但是它似乎以任意順序構建列表,因此我不確定我是否可以依靠該順序來標識值。

  XDocument xdoc = XDocument.Load(@"Export.xml");
  XNamespace xns = "http://developer.cognos.com/schemas/xmldata/1/";
  var metadataQuery = from t in xdoc.Descendants(xns + "item") select t;
  List<XElement> metadata = metadataQuery.ToList(); // This list appears to be ordered randomly

元素的順序始終相同,以它們在xml文件中出現的順序相同。

var xdoc = XDocument.Load(@"Export.xml");
XNamespace xns = "http://developer.cognos.com/schemas/xmldata/1/";

var metadata = xdoc.Descendants(xns + "item").ToList();
var data = xdoc.Descendants(xns + "row").ToList();

foreach (var datum in data)
{
    var values = datum.Elements(xns + "value").ToList();
    for (int i = 0; i < values.Count; i++)
    {
        Console.WriteLine(metadata[i].Attribute("name").Value + ": " + values[i].Value);
    }
    Console.WriteLine();
}

這是解析文件的簡單方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XElement dataset = (XElement)doc.FirstNode;
            XNamespace ns = dataset.Name.Namespace;
            var results = doc.Descendants(ns + "row").Select(x => new {
                firstAddr = (string)x.Elements(ns + "value").FirstOrDefault(),
                secondAddr = (string)x.Elements(ns + "value").Skip(1).FirstOrDefault(),
                dob = (DateTime)x.Elements(ns + "value").Skip(2).FirstOrDefault()
            }).ToList();

        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM