Sorting 按C+;中的属性对XmlDocument中的节点进行排序+;,XPath、Windows窗体

Sorting 按C+;中的属性对XmlDocument中的节点进行排序+;,XPath、Windows窗体,sorting,attributes,c++-cli,xmldocument,Sorting,Attributes,C++ Cli,Xmldocument,我想按子节点的属性对XML文档进行排序。我在Visual C++中使用Windows窗体。我试图使用提出的解决方案。但不知怎的,它不会起作用 我的未排序的XML文档如下所示: 我的已排序的XML文档应如下所示: 我尝试了以下代码,但返回的checkme-字符串是0205。所以排序根本不起作用 System::Xml::XmlDocument^sourceXmlDoc=gcnewxmldocument; sourceXmlDoc->LoadXml(“”); System::Xml::XPa

我想按子节点的属性对XML文档进行排序。我在Visual C++中使用Windows窗体。我试图使用提出的解决方案。但不知怎的,它不会起作用

我的未排序的XML文档如下所示:


我的已排序的XML文档应如下所示:


我尝试了以下代码,但返回的checkme-字符串是0205。所以排序根本不起作用

System::Xml::XmlDocument^sourceXmlDoc=gcnewxmldocument;
sourceXmlDoc->LoadXml(“”);
System::Xml::XPath::XPathNavigator^navigator=sourceXmlDoc->CreateNavigator();
System::Xml::XPath::XPathExpression ^selectExpression=navigator->Compile(“消息列表/消息”);
System::Xml::XPath::XPathExpression^SortExper=navigator->Compile(“@sendTime”);
选择Expression->AddSort(SORTEXP、XmlSortOrder::升序、XmlCaseOrder::无、“、XmlDataType::文本);
System::Xml::XPath::XPathNodeIterator^nodeIterator=navigator->Select(selectExpression);
字符串^checkMe;
while(节点编辑器->移动下一步())
{
如果(节点运算符->当前->移动到irstatAttribute())
{
checkMe=checkMe+nodeIterator->Current->Value;
}
}

此外,我还被困在while循环中如何继续。如何将重新引用的xmlDoc保存为XmlDocument?

我可能完全错了,因为.NET不是我的专长,但导航器->编译中的xpath和selectExpression->AddSort中的XML数据类型不是都错了吗

System::Xml::XPath::XPathExpression^ selectExpression = navigator->Compile("Message-List/Message");

selectExpression->AddSort(sortExpr, XmlSortOrder::Ascending, XmlCaseOrder::None, "", XmlDataType::Number);

我可能完全错了,因为.NET不是我喜欢的东西,但导航器->编译中的xpath和selectExpression->AddSort中的XML数据类型不是都错了吗

System::Xml::XPath::XPathExpression^ selectExpression = navigator->Compile("Message-List/Message");

selectExpression->AddSort(sortExpr, XmlSortOrder::Ascending, XmlCaseOrder::None, "", XmlDataType::Number);

最后,我对XML消息进行了排序

@约翰:是的,你是对的,我没有更改XmlDataType。谢谢你的提示

下面的解决方案复制一个XmlDocument,并按数字属性“sendTime”对其进行排序

//为测试创建源文档
System::Xml::XmlDocument^sourceXmlDoc=gcnewxmldocument;
sourceXmlDoc->LoadXml(“”);
//创建输入XML文档的副本
System::Xml::XmlDocument^xmlDocCopy=gcnewxmldocument;
xmlDocCopy=safe_cast(sourceXmlDoc->Clone());
//仅当存在要排序的邮件时才需要重新排序
if(xmlDocCopy->HasChildNodes)
{
//移除未排序的子对象
xmlDocCopy->FirstChild->RemoveAll();
//创建一个排序的导航器
System::Xml::XPath::XPathNavigator^navigator=sourceXmlDoc->CreateNavigator();
System::Xml::XPath::XPathExpression ^selectExpression=navigator->Compile(“消息列表/消息”);
System::Xml::XPath::XPathExpression^SortExper=navigator->Compile(“@sendTime”);
选择Expression->AddSort(SORTEXP、XmlSortOrder::升序、XmlCaseOrder::无、“、XmlDataType::编号);
System::Xml::XPath::XPathNodeIterator^nodeIterator=navigator->Select(selectExpression);
字符串^checkMe;
字符串^test=nodeIterator->Current->OuterXml;
while(节点编辑器->移动下一步())
{
XmlTextReader^xmlChildReader=gcnewxmltextreader(gcnewstringreader(nodeIterator->Current->OuterXml));
XmlNode^newNode=xmlDocCopy->ReadNode(xmlChildReader);
xmlDocCopy->FirstChild->AppendChild(newNode);
}
}

最后,我对XML消息进行了排序

@约翰:是的,你是对的,我没有更改XmlDataType。谢谢你的提示

下面的解决方案复制一个XmlDocument,并按数字属性“sendTime”对其进行排序

//为测试创建源文档
System::Xml::XmlDocument^sourceXmlDoc=gcnewxmldocument;
sourceXmlDoc->LoadXml(“”);
//创建输入XML文档的副本
System::Xml::XmlDocument^xmlDocCopy=gcnewxmldocument;
xmlDocCopy=safe_cast(sourceXmlDoc->Clone());
//仅当存在要排序的邮件时才需要重新排序
if(xmlDocCopy->HasChildNodes)
{
//移除未排序的子对象
xmlDocCopy->FirstChild->RemoveAll();
//创建一个排序的导航器
System::Xml::XPath::XPathNavigator^navigator=sourceXmlDoc->CreateNavigator();
System::Xml::XPath::XPathExpression ^selectExpression=navigator->Compile(“消息列表/消息”);
System::Xml::XPath::XPathExpression^SortExper=navigator->Compile(“@sendTime”);
选择Expression->AddSort(SORTEXP、XmlSortOrder::升序、XmlCaseOrder::无、“、XmlDataType::编号);
System::Xml::XPath::XPathNodeIterator^nodeIterator=navigator->Select(selectExpression);
字符串^checkMe;
字符串^test=nodeIterator->Current->OuterXml;
while(节点编辑器->移动下一步())
{
XmlTextReader^xmlChildReader=gcnewxmltextreader(gcnewstringreader(nodeIterator->Current->OuterXml));
XmlNode^newNode=xmlDocCopy->ReadNode(xmlChildReader);
xmlDocCopy->FirstChild->AppendChild(newNode);
}
}

我刚刚看到了这个解决方案,但在.NET4.0中,您可以使用linq。我不会把它移植到C++,但你会明白的!它是一个按属性排序的静态函数,对该方法的调用将旧节点替换为已排序的节点

    public static XmlElement OrderChildrenByAttribute(XmlElement originalElement, string attributeName)
    {
        // Sorting products
        var enumList = originalElement.ChildNodes.Cast<XmlElement>();
        var sortedList = enumList.OrderBy(p => p.GetAttribute(attributeName).Trim().ToLower());
        XmlElement result = originalElement.OwnerDocument.CreateElement(originalElement.Name, originalElement.NamespaceURI);
        foreach (var childElem in sortedList)
            result.AppendChild(childElem);
        return result;
    }

我刚刚看到了这个解决方案,但在.NET4.0中,您可以使用linq。我不会把它移植到C++,但你会明白的!它是一个按属性排序的静态函数,对该方法的调用将旧节点替换为已排序的节点

    public static XmlElement OrderChildrenByAttribute(XmlElement originalElement, string attributeName)
    {
        // Sorting products
        var enumList = originalElement.ChildNodes.Cast<XmlElement>();
        var sortedList = enumList.OrderBy(p => p.GetAttribute(attributeName).Trim().ToLower());
        XmlElement result = originalElement.OwnerDocument.CreateElement(originalElement.Name, originalElement.NamespaceURI);
        foreach (var childElem in sortedList)
            result.AppendChild(childElem);
        return result;
    }

哦,是我的错。这个例子中的编译是错误的。但在实际使用的代码中,它适合真正的XML节点。我更新了代码。我将查看selectExpression->AddSort。但是看看我发布的链接中发布的解决方案,它实际上应该是有效的。对吗?至少迪斯科在这里是这么说的:哦,我的错。这个例子中的编译是错误的。但在实际使用的代码中,它适合真正的XML节点。我更新了代码。我来看看t