Xelement.Parse不知道命名空间

时间:2014-04-29 12:35:49

标签: xml xml-parsing linq-to-xml xelement

鉴于

<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的方法(我敢说是滥用),但这是我必须忍受的。

1 个答案:

答案 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());