Xpath表达式Addsort方法

时间:2011-07-28 09:40:49

标签: c# asp.net gridview xpath

我试图为文档系统的XML文件添加排序,包括修改日期的条目。

基本上我有一个gridview来显示所有文档列表的XML,我正在显示之前对数据运行addsort。

每个文件都有一个带有true或false的标记,然后是一个已发布的日期(这些是完整的文档,因此无需修改),当文档被修改后,标记变为true,一旦完成它给出标签上的公布日期。

要获得客户需要的正确顺序,那些具有修改日期的修改后的>>具有错误修改标记的那些。

目前我按标题排序:

        StringReader str = new StringReader(PLCDocsXML.InnerXml);
        XPathDocument doc = new XPathDocument(str);
        XPathNavigator navigator2 = PLCDocsXML.CreateNavigator();
        XPathExpression subselectExpression = navigator2.Compile(XpathExpr);
        if (asc)
        {
            subselectExpression.AddSort("title", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text);
        }

XML看起来像这样:

    <result>
       <document>
          <title>Title</title>
          <otherstuff />
          <modified>[true/false]<modified> #those with true first before false
          <publishdate /> #if not got a publish date
          <publishdate>2009-10-16</publishDate>
       </document>
    </result>

所以我需要的顺序是:

     <result>
       <document>
          <title>Title1</title>
          <otherstuff />
          <modified>true<modified>
          <publishdate />
       </document>
       <document>
          <title>Title4</title>
          <otherstuff />
          <modified>true<modified>
          <publishdate>2010-11-27</publishDate>
       </document>
       <document>
          <title>Title2</title>
          <otherstuff />
          <modified>true<modified>
          <publishdate>2009-10-16</publishDate>
       </document>
       <document>
          <title>Title3</title>
          <otherstuff />
          <modified>false<modified>
          <publishdate />
       </document>
    </result>

感谢您提供任何帮助

2 个答案:

答案 0 :(得分:0)

试试这个:

var navigator = doc.CreateNavigator();
var subselectTrueExpression = navigator
    .Compile(@"//document[normalize-space(modified) = 'true']");
var subselectFalseExpression = navigator
    .Compile(@"//document[normalize-space(modified) = 'false']");

var nodes = navigator.Select(subselectTrueExpression).Cast<XPathNavigator>()
    .Concat(
        navigator.Select(subselectFalseExpression).Cast<XPathNavigator>()
    );

答案 1 :(得分:0)

我最终自己解决这个问题(我无法编译kirills,它抱怨没有连接方法)

方法是使用xpath选择来分离所有不同类型的项目,然后在迭代它们之前对它们进行各种排序,就像它们是单个项目一样,为我工作