2012-12-04 35 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