2016-09-20 4 views
0

私はXMLにC#Linqを解析しようとしている次の形式のXMLファイルを持っています。問題は、以下の値を識別する唯一のものであるこの個別のメタデータ要素があることです。これを行う良い方法はありますか?私はこのファイルの形式を変更する権限はありません。Linq to 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個のアイテムと対応する値要素と、この形式に続く数百行の要素があります。私は基本的に、メタデータを値と照合する最良の方法を探しています。 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 
+0

してください[編集]ポストを解析し、次明確にする簡単な方法はありますか?どのようにして既存のコードを改善/変更したいのですか?タスクの "より良い"基準は何ですか? –

答えて

0

要素の順序は、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(); 
} 
0

ここでファイル

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

     } 
    } 
} 
関連する問題