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>

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

提前致谢

4

1 回答 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 );

按预期工作。而且您不需要包装“根”节点。现在可以将它作为XElementanywhere 插入到any 中。

于 2012-05-05T08:08:16.660 回答