Sorting 按C+;中的属性对XmlDocument中的节点进行排序+;,XPath、Windows窗体
我想按子节点的属性对XML文档进行排序。我在Visual C++中使用Windows窗体。我试图使用提出的解决方案。但不知怎的,它不会起作用 我的未排序的XML文档如下所示: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文档应如下所示:
我尝试了以下代码,但返回的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