鉴于
<Message xmlns:cm="somenamespace">
<Person>
<cm:Name>John Doe</cm:Name>
</Person>
</Message>
我得到一个XML片段文件,其中包含以下内容(让我们称之为Fragment.xml)。
<Person>
<cm:Name>Jane Doe</cm:Name>
</Person>
我在XElement对象中有原始Person元素,我希望用片段替换它。
original.ReplaceWith(XElement.Load("Fragment.xml"));
问题是XElement.Load失败,因为它不知道在根节点声明的'cm'命名空间。此外,XElement不允许我设置内部XML。我知道这是一种有点非正统的修改XML的方法(我敢说是滥用),但这是我必须忍受的。
答案 0 :(得分:0)
AFAIK你无法摆脱片段本身无效的xml,也无法直接解析。下面是一种相当脏的方法,使用字符串Xml操作和片段的临时包装器,包含片段使用的命名空间。
const string fragmentWrapper =
@"<Message xmlns:cm=""somenamespace"">@TOKEN@</Message>";
var original = XDocument.Parse(originalXml);
var fragmentDoc = XDocument.Parse(fragmentWrapper.Replace("@TOKEN@", fragmentXml));
original.Descendants("Person")
.First().ReplaceWith(fragmentDoc.Descendants("Person")
.First());
Debug.WriteLine(original.ToString());