4

基本的に、私は 2 つの XML ドキュメントを読んでいます。最初のものには、保存する必要がある 2 つの値があります: Name と Value。2 番目には、Name、DefaultValue、Type、および Limit の 4 つの値があります。ドキュメントを読むとき、それぞれをいくつかのオブジェクトに保存したいと思います。次に、2 つのオブジェクトを 1 つに結合して、5 つの値が格納されるようにする必要があります。XML ドキュメントの長さは異なりますが、2 番目のドキュメントは常に最初のドキュメントのサイズ以上になります。

例:

<XML1>
  <Item1>
    <Name>Cust_No</Name>
    <Value>10001</Value>
  </Item1>
  <Item4>
    ITEM4 NAME AND VALUE
  </Item4>
  <Item7>
    ITEM 7 NAME AND VALUE
  </Item7>
</XML1>

<XML2>
  <Item1>
    <Name>Cust_No</Name>
    <DefaultValue></DefaultValue>
    <Type>varchar</Type>
    <Limit>15</Limit>
  </Item1>
  6 MORE TIMES ITEMS 2-7
</XML2>

XML をループするコードが既にあります。データを保存する最善の方法について本当に考える必要があります。最終的には、Name Key で 2 つのオブジェクトを結合できるようにしたいと考えています。string[]とを試しarrayList[]ましたが、組み合わせるのに苦労しました。私も を読みましたがDictionary、それも実装に問題がありました (Dictionary以前は を使用したことがありません)。

4

1 に答える 1

2

これは、2 つの XDocuments を結合し、結合されたアイテムの匿名オブジェクトを選択する Linq to Xml クエリです。各オブジェクトには 5 つのプロパティがあります。

var query = 
  from i1 in xdoc1.Root.Elements()
  join i2 in xdoc2.Root.Elements()
      on (string)i1.Element("Name") equals (string)i2.Element("Name") into g
  let j = g.SingleOrDefault() // get joined element from second file, if any
  select new {
      Name = g.Key,
      Value = (int)i1.Element("Value"),
      DefaultValue = (j == null) ? null : (string)j.Element("DefaultValue"),
      Type = (j == null) ? null : (string)j.Element("Type"),
      Limit = (j == null) ? null : (string)j.Element("Limit")
  };

次のように作成された XDocuments:

var xdoc1 = XDocument.Load(path_to_xml1);
var xdoc2 = XDocument.Load(path_to_xml2);

クエリの使用法:

foreach(var item in query)
{
   // use string item.Name
   // integer item.Value
   // string item.DefaultValue
   // string item.Type
   // string item.Limit
}
于 2013-02-20T17:52:49.707 に答える