使用可能不仅包含纯文本还包含某些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 <TAG>with custom tag value</TAG></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构建为字符串并稍后解析它的想法。
还有其他更好的方法吗?
答案 0 :(得分: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));
答案 1 :(得分: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>"));