Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对XPath或运算符结果进行排序_C#_Xpath_Or Operator - Fatal编程技术网

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

C# 对XPath或运算符结果进行排序,c#,xpath,or-operator,C#,Xpath,Or Operator,给定以下XML: <xml> <Table> <Product> <CaseName>Test 1</CaseName> <Beta>banana</Beta> <Alpha>apple</Alpha> <Delta>dates</Delta>

给定以下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>

测试1
香蕉
苹果
日期
奇库
测试2
波兰奇
阿雷德
蓝色
绿色
我想使用XPath和“or”操作符来指定Product下节点的返回顺序,但不管我使用的XPath语句是什么,查询结果总是按照原始XML的顺序返回。例如,以下XPath语句:

  • //Delta |//CaseName |//Beta
  • //CaseName |//Beta |//Delta
  • //Delta |//Beta |//案例名称
  • 按以下顺序返回所有节点:CaseName、Beta、Delta、CaseName、Beta、Delta。此顺序与原始XML节点结构匹配我可以使用什么XPath语句和“or”运算符按我想要的顺序返回节点?


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

    如果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();
    
    List name=新列表{“CaseName”、“Beta”、“Delta”};
    XDocument xDoc=XDocument.Parse(xml);
    var products=xDoc.substands(“产品”)
    .Select(p=>p.Elements()
    .Where(e=>names.Contains(e.Name.LocalName))
    .OrderBy(e=>names.IndexOf(e.Name.LocalName)).ToList()
    .ToList();
    
    关于XPath,您需要了解XPath 1.0只知道无序的节点集,因此使用
    //foo |//bar
    可以得到一组
    foo
    bar
    元素节点。大多数实现然后以文档顺序返回结果


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

    请发布一些您编写的代码,以便人们可以帮助改进XPath。XPath不是必须的,因此此技术可以工作;但是,我看不到您发布的内容与我在尝试使用XPath时指定的节点名称之间的联系。使用您的示例,我如何使用节点名称来指定我希望节点返回的顺序?宾果!这就是我要找的。谢谢谢谢,马丁。了解这一点很有用。