2012-12-04 36 views
0

鑑於以下XML:排序XPath或操作結果

<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和「或」運算符口授命令的節點下產品返回,但不管我使用的XPath語句,查詢結果總是按原始XML的順序返回。例如,以下XPath語句:

  1. // Delta | // CaseName | // Beta
  2. // CaseName | // Beta | // Delta
  3. // Delta | // Beta | // CaseName

所有按以下順序返回的節點:CaseName,Beta,Delta,CaseName,Beta,Delta。此順序與原始XML節點結構相匹配。 可以使用「or」運算符以我希望的順序返回節點的XPath語句是什麼?

我使用C#作爲我的開發環境。

+0

請發佈一些您已寫入的代碼這樣人們可以更好地幫助 –

回答

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

XPath不是必須的,所以這種技術會起作用;但是,我沒有看到您發佈的內容與我在嘗試使用XPath時指定的節點名稱之間的關係。 **使用您的示例,如何使用節點名稱來指定我希望節點返回的順序?** – OneSource

+0

@OneSource我更新了答案。 –

+1

賓果!這就是我一直在尋找的。謝謝! – OneSource

0

排序在XPath的方面,你需要了解的XPath 1.0只知道無序節點集,因此使用//foo | //bar您將獲得一組foobar元素節點。然後大多數實現以文檔順序返回結果。

如果您希望能夠定義您需要使用XPath 2.0(或XQuery 1.0)(其中數據模型知道節點(和原子項)的有序序列)的位置,則可以使用逗號運算符,//foo, //bar得到一個foobar元素節點的序列。但是,Microsoft .NET Framework類庫沒有帶有XPath 2.0實現,您需要使用切換到第三方解決方案(如XmlPrime或Saxon 9的.NET版本)。

+0

謝謝@MartinH。這對知道有用。 – OneSource