0

用可能不仅包含纯文本还包含一些 XML 节点的测试来填充 XElement 的最佳方法是什么?

例如,这段代码

XElement el = new XElement("XML_NODE");
el.Value = "some text <TAG>with custom tag value</TAG>";
string xml = el.ToString();

将返回 xml 作为<XML_NODE>some text &lt;TAG&gt;with custom tag value&lt;/TAG&gt;</XML_NODE>. 我了解发生了什么以及为什么会发生。但这并不完全是我想要的......我希望得到类似于<XML_NODE>some text <TAG>with custom tag value</TAG></XML_NODE>不引用内括号的 xml。

下一段代码就可以达到想要的结果

XElement el2 = XElement.Parse("<XML_NODE>some text <TAG>with custom tag value</TAG></XML_NODE>");
xml = el2.ToString();

但我不喜欢将 XML 构建为字符串并稍后解析它的想法。

还有其他更好的获取方式吗?

4

2 回答 2

3

另一种可能更有效的替代方案:

static IEnumerable<XNode> ParseNodes(string value)
{
   var settings = new XmlReaderSettings 
   { 
      ConformanceLevel = ConformanceLevel.Fragment 
   };

   using (var sr = new StringReader(value))
   using (var xr = XmlReader.Create(sr, settings))
   {
      xr.Read();
      while (xr.ReadState != ReadState.EndOfFile)
      {
         yield return XNode.ReadFrom(xr);
      }
   }
}

string text = "some text <TAG>with custom tag value</TAG>";
var node = new XElement("XML_NODE", ParseNodes(text));
于 2013-01-23T15:38:12.837 回答
1

正如我在评论中所说,真的没有更好的方法。但是您可以在某种程度上封装这种“不太好”的方式:

public IEnumerable<XNode> ParsePartial(string partialXml)
{
    return XElement.Parse(string.Format("<tmp>{0}</tmp>", partialXml)).Nodes();
}

var el3 = new XElement("XML_NODE",
                       ParsePartial("some text <TAG>with custom value</TAG>"));
于 2013-01-23T15:11:30.427 回答