对XPath或运算符结果进行排序

时间:2012-12-04 09:17:17

标签: c# xpath or-operator

给出以下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和“或”运算符来指示返回 Product 下的节点的顺序,但无论我使用哪种XPath语句, 查询结果始终按原始XML 的顺序返回。例如,以下XPath语句:

  1. // Delta | // CaseName | //贝塔
  2. // CaseName | // Beta | //德尔塔
  3. // Delta | // Beta | // CaseName
  4. 按以下顺序返回所有节点:CaseName,Beta,Delta,CaseName,Beta,Delta。此顺序与原始XML节点结构匹配。 我可以使用什么XPath语句与“或”运算符按照我想要的顺序返回节点?

    我正在使用C#作为我的开发环境。

2 个答案:

答案 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();

答案 1 :(得分:0)

就XPath而言,您需要了解XPath 1.0只知道无序节点集,因此使用//foo | //bar可以获得一组foobar个元素节点。然后,大多数实现按文档顺序返回结果。

如果您希望能够定义使用XPath 2.0(或XQuery 1.0)所需的顺序,其中数据模型知道有序的节点序列(和原子项),那么您可以使用逗号运算符{{1} }在,中获取//foo, //barfoo个元素节点的序列。但是,Microsoft .NET框架类库没有附带XPath 2.0实现,您需要使用切换到第三方解决方案,如XmlPrime或.NET版本的Saxon 9。