将"原始"XML字符串插入XElement

Fra*_*ome 4 c# linq xelement

我正在尝试将节点(以字符串格式)加载到XElement中.虽然这应该很容易,但我发现了一些问题:

  • 我正在尝试加载的节点包含某些子节点中的命名空间引用
  • 当我尝试使用XElement.Load()Xelement.Parse()我得到预期的未定义的命名空间错误

我知道解决方案是使用命名空间定义创建一个周围的节点,然后加载整个东西,但我想知道是否有一个更优雅的解决方案,不涉及字符串操作.

这是我失败的尝试:(

我有一组命名空间属性:

private readonly List<XAttribute> _namespaces;
Run Code Online (Sandbox Code Playgroud)

这已经填充并包含所有必要的命名空间.因此,要将我的XML字符串嵌入另一个节点,我这样做:

var temp = new XElement("root", (from ns in _namespaces select ns), MyXMLString);
Run Code Online (Sandbox Code Playgroud)

但正如我所预料的那样,MyXMLString的内容会被转义并成为文本节点.我得到的结果是:

<root xmlns:mynamespace="http://mynamespace.com">&lt;mynamespace:node&gt;node text&lt;/node&gt;</root>
Run Code Online (Sandbox Code Playgroud)

我正在寻找的结果是:

<root xmlns:mynamespace="http://mynamespace.com">
<mynamespace:node>node text</node>
</root>
Run Code Online (Sandbox Code Playgroud)

有一个巧妙的方法来做到这一点?

提前致谢

yam*_*men 5

据推测,您的XML文本实际上已经很好地形成了(注意结束标记上的名称空间限定符):

var xml = "<mynamespace:node>node text</mynamespace:node>";
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以使用它来手动指定名称空间:

var mngr = new XmlNamespaceManager( new NameTable() );
mngr.AddNamespace( "mynamespace", "urn:ignore" ); // or proper URL
var parserContext = new XmlParserContext(null, mngr, null, XmlSpace.None, null);
Run Code Online (Sandbox Code Playgroud)

现在阅读并加载:

var txtReader = new XmlTextReader( xml, XmlNodeType.Element, parserContext );
var ele = XElement.Load( txtReader );
Run Code Online (Sandbox Code Playgroud)

按预期工作.而且您不需要包装器"root"节点.现在,这可以插入到任何XElement地方.