将“原始”XML字符串插入XElement

时间:2012-05-05 04:56:18

标签: c# linq xelement

我正在尝试将节点(字符串格式)加载到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 个答案:

答案 0 :(得分: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随处插入任何内容。