将 XmlDocument 中的节点集替换为另一个 XmlDocument 文件
本文关键字:XmlDocument 另一个 文件 替换 节点 点集 | 更新日期: 2023-09-27 18:32:37
我想知道执行以下操作的最佳方法是什么:
目录"输入.xml"和"元数据.xml"中有 2 个 XML 文件。
输入.xml:
<Root>
<Header>
<ID>1</ID>
<Name>Test</Name>
</Header>
<Body>
<MetaDataSet>
<ID>23568</ID>
<Value>metadatavalue1</Value>
</MetaDataSet>
</Body>
</Root>
元数据.xml:
<MetaDataSet>
<metadatasetvalue>Test</metadatasetvalue>
<Valid>true</Valid>
</MetaDataSet>
我想做的是能够将"输入.xml"的节点集"MetaDataSet"替换为文件"元数据.xml"的全部内容。因此,生成的输出将是:
<Root>
<Header>
<ID>1</ID>
<Name>Test</Name>
</Header>
<Body>
<MetaDataSet>
<metadatasetvalue>Test</metadatasetvalue>
<Valid>true</Valid>
</MetaDataSet>
</Body>
</Root>
是否可以在 c# 中将节点集替换为 XmlDocument?
你可以读取两个 XmlDocument 类中的两个 Xml 文档,调用 SelectSingleNode,然后将找到的元素的 InnerXml 替换为元 DocumentElement 的 OuterXml,如下所示:
var i = @"
<Root>
<Header>
<ID>1</ID>
<Name>Test</Name>
</Header>
<Body>
<MetaDataSet>
<ID>23568</ID>
<Value>metadatavalue1</Value>
</MetaDataSet>
</Body>
</Root>";
var m = @"
<MetaDataSet>
<metadatasetvalue>Test</metadatasetvalue>
<Valid>true</Valid>
</MetaDataSet>
";
var input2 = new XmlDocument();
input2.Load(new StringReader(i));
var meta2 = new XmlDocument();
meta2.Load(new StringReader(m));
var body2 = input2.DocumentElement["Body"];
body2.InnerXml = meta2.DocumentElement.OuterXml;
// helper to show the result
sb = new StringBuilder();
using(var xw = XmlWriter.Create(sb)) {
input2.Save(xw);
}
sb.Dump("2");
如果您愿意更改为 XDocument 类,则可以在元素上使用 ReplaceNodes:
var inDoc = XDocument.Parse(i);
var metaDoc = XDocument.Parse(m);
var body = inDoc.Root.Element("Body");
body.ReplaceNodes(metaDoc.Root);
// helper to show the result
var sb = new StringBuilder();
using(var xw = XmlWriter.Create(sb))
{
inDoc.WriteTo(xw);
}
sb.Dump(); // LinqPad helper
也可以将 ReplaceWith 和 XPath 与 LINQ-to-XML 一起使用。
假设与 @rene 对变量 i
和 m
的答案中的 init 相同:
using System.Xml.Linq;
using System.Xml.XPath;
var inDoc = XElement.Parse(i);
var metaDoc = XElement.Parse(m);
inDoc.XPathSelectElement("//Body/MetaDataSet").ReplaceWith(metaDoc);