Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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/0/xml/14.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# XPathExpression AddSort失败_C#_Xml_Xpath - Fatal编程技术网

C# XPathExpression AddSort失败

C# XPathExpression AddSort失败,c#,xml,xpath,C#,Xml,Xpath,我试图对xpath查询的结果进行排序,但失败了 输出: ABC DEF 但我期待着: DEF ABC 源代码如下所示,它使用XML表达式并对结果进行排序: var doc = new XPathDocument("testmsg2.xml"); var nav = doc.CreateNavigator(); const string query = "//Z/X/Code"; var expr = nav.Compile(query); expr.AddSort("Code",

我试图对xpath查询的结果进行排序,但失败了

输出:

ABC
DEF
但我期待着:

DEF
ABC
源代码如下所示,它使用XML表达式并对结果进行排序:

var doc = new XPathDocument("testmsg2.xml");
var nav = doc.CreateNavigator();

const string query = "//Z/X/Code";

var expr = nav.Compile(query);
expr.AddSort("Code",
             XmlSortOrder.Descending,
             XmlCaseOrder.None,
             "",
             XmlDataType.Text);

switch (expr.ReturnType)
{                
    case XPathResultType.NodeSet:
        var nodes = (XPathNodeIterator)nav.Evaluate(expr);

        while (nodes != null && nodes.MoveNext())
        {
            if (nodes.Current == null)
                continue;

            if (nodes.Current.HasChildren)
            {
                var childIter = nodes.Current.SelectChildren(XPathNodeType.All);

                while (childIter.MoveNext())
                {
                    if (childIter.Current != null)
                        Console.WriteLine(childIter.Current.Value);
                }
            }
            else
            {
                Console.WriteLine(nodes.Current.Value);
            }
        }

        break;
}
此示例简化了XML文件:

<?xml version="1.0" encoding="utf-8"?>
<Z>
  <X>
    <Code>ABC</Code>
  </X>
  <X>
    <Code>DEF</Code>
  </X>
</Z>

AddSort
方法采用一个XPath表达式,该表达式在上下文中绑定到您编译的
XPathExpression
。在您的例子中,
XPathExpression
是针对
元素编译的。执行
AddSort(“code”)
意味着您拥有以下XML:

<Code>
    <Code>
    </Code>
</Code>
相反,您可以将表达式编译为
X

const string query = "//Z/X";
或者您可以在当前节点(即
code
)上进行排序,

expr.AddSort(".", XmlSortOrder.Descending, XmlCaseOrder.None, "", XmlDataType.Text);

AddSort
方法采用一个XPath表达式,该表达式在上下文中绑定到您编译的
XPathExpression
。在您的例子中,
XPathExpression
是针对
元素编译的。执行
AddSort(“code”)
意味着您拥有以下XML:

<Code>
    <Code>
    </Code>
</Code>
相反,您可以将表达式编译为
X

const string query = "//Z/X";
或者您可以在当前节点(即
code
)上进行排序,

expr.AddSort(".", XmlSortOrder.Descending, XmlCaseOrder.None, "", XmlDataType.Text);

那么您的路径
//Z/X/code
选择
code
元素,排序需要使用适当的相对表达式

expr.AddSort(".",
             XmlSortOrder.Descending,
             XmlCaseOrder.None,
             "",
             XmlDataType.Text);

那么您的路径
//Z/X/code
选择
code
元素,排序需要使用适当的相对表达式

expr.AddSort(".",
             XmlSortOrder.Descending,
             XmlCaseOrder.None,
             "",
             XmlDataType.Text);

从查询中删除“/Code”或使用“.”代替AddSort()中的“Code”-具体取决于您是要选择X节点还是代码节点。目前,您正在查询代码节点,然后尝试根据XPath“代码”对结果返回的内容对它们进行排序。但是没有与代码节点相关的“Code”匹配的内容。

请从查询中删除“/Code”,而不是AddSort()中的“Code”——具体取决于您是选择X节点还是代码节点。目前,您正在查询代码节点,然后尝试根据XPath“代码”对结果返回的内容对它们进行排序。但是,相对于代码节点,没有任何东西与“代码”相匹配。

可以使用Linq to Xml

using System.Xml.XPath;

var document = XDocument.Parse(@"<Z>
                                  <X>
                                    <Code>ABC</Code>
                                  </X>
                                  <X>
                                    <Code>DEF</Code>
                                  </X>
                                 </Z>");

var codeValues = document.XPathSelectElements("//Z/X/Code")
                          .Select(e => e.Value)
                          .OrderByDescending(e => e);

如果需要,您可以进一步简化它。不过,您需要考虑性能。如果您的xml文件很大,我想这不会有好的效果。如果您只有小文件,那么这样做的简单性超过了小的性能损失

使用Linq到Xml的一些替代方法

using System.Xml.XPath;

var document = XDocument.Parse(@"<Z>
                                  <X>
                                    <Code>ABC</Code>
                                  </X>
                                  <X>
                                    <Code>DEF</Code>
                                  </X>
                                 </Z>");

var codeValues = document.XPathSelectElements("//Z/X/Code")
                          .Select(e => e.Value)
                          .OrderByDescending(e => e);

如果需要,您可以进一步简化它。不过,您需要考虑性能。如果您的xml文件很大,我想这不会有好的效果。如果您只有小文件,那么这样做的简单性超过了小的性能损失

如果我想对内容进行排序并将/代码留在那里该怎么办?对不起,我不太确定您想要实现什么。您希望您的查询结果在第一级看起来如何?如果我想对contect排序并将/Code保留在那里该怎么办?对不起,我不太确定您想要实现什么。您希望您的查询结果在第一级看起来如何?虽然这在技术上不是一个错误的答案,但它与OP遇到的问题无关。这是一个替代方案,而不是一个解决方案。感谢DanAtkinson的否决票。第一段说这是另一种选择。一个有效的,更优雅的选择。不是我否决了你()。尽管我很乐意承认我可能伪造了那个形象。我不知道这是为了什么目的。虽然从技术上来说这不是一个错误的答案,但它与OP的问题无关。这是一个替代方案,而不是一个解决方案。感谢DanAtkinson的否决票。第一段说这是另一种选择。一个有效的,更优雅的选择。不是我否决了你()。尽管我很乐意承认我可能伪造了那个形象。但我不知道目的是什么。