将嵌套对象从一个 XmlDocument 复制到另一个 XmlDocument
本文关键字:XmlDocument 一个 复制 另一个 对象 嵌套 | 更新日期: 2023-09-27 18:36:55
我在这个问题上很聪明。这是我拥有的文档:
<?xml version="1.0"?>
<TestObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Property1>TestObjectVal1</Property1>
<Property2>TestObjectVal2</Property2>
<Property3>TestObjectVal3</Property3>
<SubObject>
<Prop1>TestObject2Val1</Prop1>
<Prop2>TestObject2Val2</Prop2>
<Prop3>TestObject2Val3</Prop3>
</SubObject>
</TestObject>
我正在尝试将其选择的部分复制到基于某些指定 XPath 的新 XmlDocument 对象。我已经尝试了我能想到的所有排列。这就是我现在所处的位置。
var filters = new[] { "Property1", "Property2", "SubObject/Prop1" };
var xmlDoc = GetObjectXml(obj); //Loads the document
var newDoc = (XmlDocument)xmlDoc.Clone();
newDoc.DocumentElement.RemoveAll();
var rootNode = xmlDoc.DocumentElement;
foreach (var filter in filters)
{
var nodes = rootNode.SelectNodes(filter);
foreach (XmlNode node in nodes)
{
var newNode = newDoc.ImportNode(node, true);
newDoc.DocumentElement.AppendChild(newNode);
}
}
我得到的是这样的:
<?xml version="1.0"?>
<TestObject>
<Property1>TestObjectVal1</Property1>
<Property2>TestObjectVal2</Property2>
<Prop1>TestObject2Val1</Prop1>
</TestObject>
但我想要这个:
<?xml version="1.0"?>
<TestObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Property1>TestObjectVal1</Property1>
<Property2>TestObjectVal2</Property2>
<SubObject>
<Prop1>TestObject2Val1</Prop1>
</SubObject>
</TestObject>
知道我做错了什么吗?
看起来问题是 xpath 方法正在选择内部元素,因此 *SubObject" 信息丢失了。 此代码应为您的特定示例生成正确的输出。
foreach (XmlNode node in nodes)
{
XmlElement newNode;
string[] xpathElements = filter.Split('/');
if (xpathElement.Length == 2)
{
newNode = newDoc.CreateElement(filter);
newNode.AppendChild(newDoc.ImportNode(node, true));
}
else
{
newNode = newDoc.ImportNode(node, true);
}
newDoc.DocumentElement.AppendChild(newNode);
}
请注意,此代码对"过滤器"xpath 表达式必须采用的形式做出了限制性假设...也就是说,它必须是"RootElement"或"RootElement/ChildElement"的形式(没有最大深度为三的属性)。 根据您的用例,这可能就足够了,但是解决更一般的情况会更棘手......