向XElement中插入“原始”XML字符串

4
我正在尝试将一个节点(以字符串格式)加载到XElement中。虽然这应该很容易,但我遇到了一些问题:
  • 我尝试加载的节点包含某些子节点中的命名空间引用
  • 当我尝试使用XElement.Load()Xelement.Parse()时,我会得到预期的未定义命名空间错误

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

以下是我的失败尝试:(

我有一个命名空间属性的集合:

private readonly List<XAttribute> _namespaces;

这里已经填充了所有必要的命名空间。 因此,为了将我的XML字符串嵌入到另一个节点中,我正在执行以下操作:
var temp = new XElement("root", (from ns in _namespaces select ns), MyXMLString);

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

<root xmlns:mynamespace="http://mynamespace.com">&lt;mynamespace:node&gt;node text&lt;/node&gt;</root>

我需要的结果是:
<root xmlns:mynamespace="http://mynamespace.com">
<mynamespace:node>node text</node>
</root>

有没有一种简便的方法来做这件事?提前谢谢。
1个回答

5

假设你的XML文本实际上是格式良好的(请注意关闭标签上的命名空间限定符):

var xml = "<mynamespace:node>node text</mynamespace:node>";

在某些情况下,您可以使用此选项手动指定命名空间:
var mngr = new XmlNamespaceManager( new NameTable() );
mngr.AddNamespace( "mynamespace", "urn:ignore" ); // or proper URL
var parserContext = new XmlParserContext(null, mngr, null, XmlSpace.None, null);

现在阅读并加载:
var txtReader = new XmlTextReader( xml, XmlNodeType.Element, parserContext );
var ele = XElement.Load( txtReader );

正常工作。您不需要包装器“root”节点。现在可以将其插入到任何位置作为XElement


是的,XML 片段格式良好,我在输入示例时犯了一个错误。一旦在 XElement 中加载,这种方法是否允许我访问 "mynamespace:node"? - Fran Casadome
当然,试一下就知道了。你会得到一个良好形式的XElement,它代表着XML字符串。 - yamen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接