【问题标题】:Avoid xml escaping of angle brackets, when passing xml string to System.Xml.Linq.XElement在将 xml 字符串传递给 System.Xml.Linq.XElement 时,避免尖括号的 xml 转义
【发布时间】:2015-04-15 06:27:10
【问题描述】:

我从string GetXmlString() 得到一个字符串;这是我无法改变的。

我必须将此附加到 new XElement ("parent" , ... ); 内的 xml 中,到 ... 区域。

我得到的这个字符串是以下格式。

<tag name="" value =""></tag>
<tag name="" value =""></tag>
<tag name="" value =""></tag>
...

我想要的最终结果是这样的

<parent>
<tag name="" value =""></tag>
<tag name="" value =""></tag>
<tag name="" value =""></tag>
<tag name="" value =""></tag>
<tag name="" value =""></tag>
...
</parent>

当我将字符串作为XElement("root", GetXmlString()) 传递时 > 编码为 &amp;lt;&amp;gt

当我尝试 XElement.Parse(GetXmlString())XDocument.Parse(GetXmlString()) 时,我得到 There are multiple root elements 异常。

如何在不转义括号的情况下获得所需的输出?我错过了什么?

【问题讨论】:

  • 这不是“ASCII 编码”——它是 XML 转义。

标签: c# xml xelement


【解决方案1】:

最简单的选择可能是它一个根元素,然后将其解析为XML:

var doc = XDocument.Parse("<parent>" + text + "</parent>");

如果需要附加到现有元素,可以使用:

var elements = XElement.Parse("<parent>" + text + "</parent>").Elements();
existingElement.Add(elements);

【讨论】:

  • 我的问题有点误导。我做了一点编辑。我必须坚持给出的最终结果格式。还有多个parent 元素。您的解决方案在 parent 元素中添加了另一个 root 元素,对吗?
  • @DanDole:不,它没有——它根本没有parent 元素。您只需将root 更改为parent,即可获得完整的结果。根本不需要new XElement("parent", ...),除非您需要将其添加到 existing 元素中 - 这仍然很容易,但从您的问题中不清楚您实际需要什么。
【解决方案2】:

Jon 建议的替代方法是为您的片段创建一个 XmlReader 并从中解析:

var element = new XElement("parent");

var settings = new XmlReaderSettings
{
    ConformanceLevel = ConformanceLevel.Fragment
};

var text = GetXmlString();

using (var sr = new StringReader(text))
using (var xr = XmlReader.Create(sr, settings))
{
    xr.MoveToContent();

    while (!xr.EOF)
    {
        var node = XNode.ReadFrom(xr);   
        element.Add(node);
    }
}

如果“父”元素已经存在,这将很有用,否则在每一端简单连接 XML 节点和解析会更简单。

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    相关资源
    最近更新 更多