【问题标题】:Xelement.Parse without knowing the namespaceXelement.Parse 不知道命名空间
【发布时间】:2014-04-29 12:35:48
【问题描述】:

给定

<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 的一种有点非正统的方式(我敢说是滥用),但这是我必须忍受的。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 2011-08-26
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多