0

次のXMLが与えられます:

<xml>
    <Table>
        <Product>
            <CaseName>Test 1</CaseName>
            <Beta>banana</Beta>
            <Alpha>apple</Alpha>
            <Delta>dates</Delta>
            <Chi>chiku</Chi>
        </Product>
        <Product>
            <CaseName>Test 2</CaseName>
            <Beta>borange</Beta>
            <Alpha>ared</Alpha>
            <Delta>dblue</Delta>
            <Chi>cgreen</Chi>
        </Product>
    </Table>
</xml>

XPathと「or」演算子を使用してProductの下のノードが返される順序を指定したいのですが、使用するXPathステートメントに関係なく、クエリ結果は常に元のXMLの順序で返されます。たとえば、次のXPathステートメント:

  1. //デルタ| // CaseName | //ベータ
  2. // CaseName | //ベータ| //デルタ
  3. //デルタ| //ベータ| // CaseName

すべてのリターンノードは、CaseName、Beta、Delta、CaseName、Beta、Deltaの順序で表示されます。この順序は、元のXMLノード構造と一致します。「or」演算子でどのXPathステートメントを使用して、希望する順序でノードを返すことができますか?

開発環境としてC#を使用しています。

4

2 に答える 2

1

XPathが必須ではない場合は、LinqToXmlを使用して要素を並べ替えることができます

XDocument xDoc = XDocument.Parse(xmlstring); //or XDocument.Load(filename)
var products = xDoc.Descendants("Product")
                .Select(p => p.Elements().OrderBy(e => e.Name.LocalName).ToList())
                .ToList();

または多分このようなもの

List<string> names = new List<string>{ "CaseName", "Beta", "Delta" };

XDocument xDoc = XDocument.Parse(xml);
var products = xDoc.Descendants("Product")
                .Select(p => p.Elements()
                              .Where(e => names.Contains(e.Name.LocalName))
                              .OrderBy(e => names.IndexOf(e.Name.LocalName)).ToList())
                .ToList();
于 2012-12-04T09:22:39.900 に答える
0

XPathに関しては、XPath 1.0は順序付けされていないノードセットしか認識しないため、要素ノード//foo | //barのセットを取得することを理解する必要があります。その後、ほとんどの実装は結果をドキュメント順に返します。foobar

データモデルがノード(およびアトミックアイテム)の順序付けられたシーケンスを認識しているXPath 2.0(またはXQuery 1.0)を使用する必要がある順序を定義できるようにする場合は、のようにコンマ演算子,を使用して次//foo, //barのシーケンスを取得できます。fooおよびbar要素ノード。ただし、Microsoft .NETFrameworkクラスライブラリにはXPath2.0実装が付属していないため、XmlPrimeや.NETバージョンのSaxon9などのサードパーティソリューションに切り替えるために使用する必要があります。

于 2012-12-04T10:56:08.460 に答える