1

我有使用 XPath 过滤的 Xml(类似于此的查询):

    XmlNodeList allItems = 
xDoc.SelectNodes("//Person[not(PersonID = following::Person/PersonID)]");

这会过滤我原始 Persons Xml 中的所有重复项。我想从上面生成的 XmlNodeList 创建一个新的 XmlDocument 实例。目前,我能看到的唯一方法是遍历 XmlNode 的列表并构建一个 Xml 字符串(这样):

        XmlNodeList allItems = xDoc.SelectNodes("//Person[not(PersonID = following::Person/PersonID)]");
        StringBuilder xml = new StringBuilder("<Persons>");

        foreach (XmlNode node in allItems)
            xml.Append(node.OuterXml);

        xml.Append("</Persons>");

        XmlDocument newXDoc = new XmlDocument();
        newXDoc.LoadXml(xml.ToString());

必须有更有效的方法来做到这一点?

4

2 回答 2

1

如果您乐意将其转换为 LINQ to XML,那真的很简单:

XDocument original = ...; // However you load the original document
// Separated out for clarity - could be inlined, of course
string xpath = "//Person[not(PersonID = following::Person/PersonID)]"

XDocument people = new XDocument(
    new XElement("Persons",
        original.XPathSelectElements(xpath)
    )
);

您绝对不需要将每个节点转换为字符串并返回。你也不需要XmlDocument,但它不会像使用 LINQ to XML 那样简单:)

于 2015-06-22T09:04:51.400 回答
1

XmlDocument你可以使用

XmlDocument doc2 = new XmlDocument();
doc2.AppendChild(doc2.CreateElement("Persons"));
foreach (XmlElement person in allItems)
{
  doc2.DocumentElement.AppendChild(doc2.ImportNode(person, true));
}
于 2015-06-22T09:14:09.273 回答