2017-06-17 8 views
0

以下は、開始するxmlと達成しようとしているxmlの結果の例です。私が理解しようとしているのは、目的のXMLを作成する方法ではなく、同じ開始値を持つすべての一致ノードを取得する方法です。例えば、以下に示すように、xmlにはリンゴがあり、リンゴには2つのノードがあります。私はそれらのノードをすべて見つけて、その後にカスタムXMLを作成したいと思う。C#一致する値を持つxmlのすべてのノードを選択する方法

xmlのすべてのノードに対してどのようにループして、同じノードレベルで一致する値を持つすべての結果を見つけるか?

<?xml version="1.0"?> 
<results> 
    <result> 
     <fruit>apples</fruit> 
     <price>0</price> 
    </result> 
    <result> 
     <fruit>pears</fruit> 
     <price>1</price> 
    </result> 
    <result> 
     <fruit>apples</fruit> 
     <price>2</price> 
    </result> 
</results> 



<?xml version="1.0"?> 
<results> 
    <result> 
     <fruit>apples</fruit> 
     <prices> 
      <price>0</price> 
      <price>2</price> 
     </prices> 
    </result> 
    <result> 
     <fruit>pears</fruit> 
     <prices> 
      <price>1</price> 
     </prices> 
    </result> 
</results> 
+0

を与えるクエリの仕様は何ですか、と予想される結果は何ですか? –

+0

@RobertHarvey私のクエリは、基本的に 'xdoc.Elements(" results ")です。要素(" result ")'それらの結果のそれぞれに対して、フルーツ –

答えて

0

XDocumentを使用してこれを実行できます。輸入することを忘れないでください。

using System.Xml.Linq; 
using System.Xml.XPath; 

負荷ドキュメント

 XDocument doc = XDocument.Load("C:\\t\\My File2.txt"); 
  1. 3個のリンゴ1個の梨
  2. がグループからの結果の要素を入れて、配列にそれらを追加例えば果物の値によって、すべての結果の要素
  3. グループを選択します
  4. 結果要素を含む配列を含むリストを作成

     List<XElement[]> multipleElements = doc 
         .XPathSelectElements("results/result") 
         .GroupBy(result => result.Element("fruit").Value) 
         .Select(groupContent => groupContent.ToArray()) 
         .ToList(); 
    

===========結果===================

List [0] { apples,apples} 
List [1] { pear } 

XML I上でテスト:

<?xml version="1.0"?> 
 
<results> 
 
    <result> 
 
     <fruit>apples</fruit> 
 
     <price>0</price> 
 
    </result> 
 
    <result> 
 
     <fruit>pears</fruit> 
 
     <price>1</price> 
 
    </result> 
 
    <result> 
 
     <fruit>apples</fruit> 
 
     <price>2</price> 
 
    </result> 
 
</results>

0

このVBコードは、所望の出力を生成します。結果として選択し、果物の値で注文し、次に簡単なループを使用して目的の出力を作成します。

Dim xe As XElement 
    ' to load from a file 
    ' Dim yourpath As String = "your path here" 
    'xe = XElement.Load(yourpath) 

    ' for testing 
    xe = <results> 
      <result> 
       <fruit>apples</fruit> 
       <price>0</price> 
      </result> 
      <result> 
       <fruit>pears</fruit> 
       <price>1</price> 
      </result> 
      <result> 
       <fruit>apples</fruit> 
       <price>2</price> 
      </result> 
     </results> 


    Dim oxe As XElement = <results></results> 
    Dim rsltproto As XElement = <result> 
            <fruit></fruit> 
            <prices></prices> 
           </result> 
    Dim rslt As XElement 
    Dim fruit As String 
    'select all <result> order by fruit values 
    Dim allfruits As IEnumerable(Of XElement) = xe...<result>.OrderBy(Function(el) el.<fruit>.Value) 

    'simple loop to create new XML 
    For Each el As XElement In allfruits 
     If el.<fruit>.Value <> fruit Then 
      If rslt IsNot Nothing Then 
       oxe.Add(rslt) 
      End If 
      fruit = el.<fruit>.Value 
      rslt = New XElement(rsltproto) 
      rslt.<fruit>.Value = fruit 
     End If 
     rslt.<prices>.LastOrDefault.Add(el.<price>) 
    Next 
    If rslt IsNot Nothing Then 
     oxe.Add(rslt) 
    End If 


    ' to save file 
    ' xe.Save(yourpath) 
0

これはLinqPadで

var doc = XDocument.Load(@"<path>\test.xml"); 

var fruitPrices = doc.XPathSelectElements("results/result") 
     .Select(d => new { 
      Fruit = d.Element("fruit").Value, 
      // TODO: parse to int if required 
      Price = d.Element("price").Value 
     }) 
     .GroupBy(f => f.Fruit) 
     .Select(g => new {Fruit = g.Key, Prices = g.Select(x => x.Price)}) 
     .ToList(); 

上記ティモンの答えに簡単な変更で、これは

enter image description here

関連する問題