タグ:

Linqを使用してXMLの構造を変更する方法です

サンプルコード

Sub Main()
  Dim BaseItem As XElement = _
      <Root>
            <Item id="1">a</Item>
            <Item id="2">b</Item>
            <Item id="3">c</Item>
            <Item id="4">d</Item>
            <Item id="5">e</Item>
      </Root>

  'XML変換のクエリ??実行
  Dim NewItem As XElement = _
  <root>
    <%= From C In BaseItem.Descendants("Item") Select <item id=<%= C.@id %>><%= C.Value %>
      <%= From D In BaseItem.Descendants("Item") Where C.@id <> D.@id Select <item2 id=<%= D.@id %>><%= D.Value %></item2> %>
    </item>%>
  </root>
  NewItem.Save("C:\test.xml")
End Sub
<!--出力結果-->
<?xml version="1.0" encoding="utf-8"?>
<root>
  <item id="1">a
    <item2 id="2">b</item2>
    <item2 id="3">c</item2>
    <item2 id="4">d</item2>
    <item2 id="5">e</item2>
  </item>
  <item id="2">b
    <item2 id="1">a</item2>
    <item2 id="3">c</item2>
    <item2 id="4">d</item2>
    <item2 id="5">e</item2>
  </item>
  <item id="3">c
    <item2 id="1">a</item2>
    <item2 id="2">b</item2>
    <item2 id="4">d</item2>
    <item2 id="5">e</item2>
  </item>
  <item id="4">d
    <item2 id="1">a</item2>
    <item2 id="2">b</item2>
    <item2 id="3">c</item2>
    <item2 id="5">e</item2>
    </item>
  <item id="5">e
    <item2 id="1">a</item2>
    <item2 id="2">b</item2>
    <item2 id="3">c</item2>
    <item2 id="4">d</item2>
  </item>
</root>

上記のサンプルコードではBaseItemのItemノードの子ノードに親ノードの@IDが一致しないものがNewItemに生成されます。ちょっとややこしいく見えますが、コードを見やすいように改行するとわかりやすくなると思います。また、プログラム内にスキーマを定義していればインテリセンス??(コードの候補の事)が表示されるようです。


エレメントを特定の順序で取得する

サンプルコード

Imports system.xml.Xpath

Sub Main()
  Dim Root As XElement = XElement.Load("C:\test.xml")
  '読み込んだXMLから"Item"のエレメントを'id'順に取得する
  Dim Query As IEnumerable(Of XElement) = From C In Root.Descendants("Item") _
                                          Order By C.@id Ascending

  '読み込んだXMLから"Item"のエレメントをxPath式を使用して'id'順に取得する
  Dim useXpathQuery As IEnumerable(Of XElement) = From C In Root.XPathSelectElements(".//Item") _
					           Order By C.@id Ascending

  For Each testItem As XElement In Query
    Console.WriteLine(testItem.Value)
  Next

  For Each testItem As XElement In useXpathQuery
    Console.WriteLine(testItem.Value)
  Next
End Sub

ID属性値の順番で取得するサンプルです。