从较大的字符串中提取Xml元素

时间:2015-04-25 22:36:48

标签: c# xml linq-to-xml

我有一个以xml元素开头的字符串,然后在Element结束后继续使用常规文本。

像这样:

<SomeElement SomeAtt="SomeValue"><SomeChild/></SomeElement> More random text.

我想将第一部分解析为XElement,然后将以下文本分离为字符串变量。 我考虑过只计算anglebrackets,但是有合法的XML可以让我失望。 我更喜欢使用开箱即用的解析器。 我尝试过使用XmlReader和XElement.Parse方法。我希望它们在读取元素后停止,而不是因为Xml元素之后的意外文本而抛出异常。到目前为止我还没能到达。 XmlReader有一个ReadSubtree方法,但我无法使它工作。

有什么想法吗?

修改

  • 附加信息:随机文本可能包含尖括号。
  • 其他信息:从概念上讲,XML可能包含xml注释,其中可能包含不匹配的括号。因此,解决方案的目的是为了普遍适用,但在我的特定情况下不是必需的。

2 个答案:

答案 0 :(得分:4)

一种可能的简单方法可能是将整个字符串包装在根节点中,以使其成为有效的XML并且可以XElementXDocument解析:

var xml = @"<SomeElement SomeAtt=""SomeValue""><SomeChild/></SomeElement> More random text.";
xml = string.Format("<root>{0}</root>", xml);
var doc = XDocument.Parse(xml);
var element = doc.Root.Elements().First();
var trailingString = doc.Root.LastNode;

Console.WriteLine(element.ToString());
Console.WriteLine();
Console.WriteLine(trailingString.ToString());

控制台输出:

<SomeElement SomeAtt="SomeValue">
  <SomeChild />
</SomeElement>

 More random text.

答案 1 :(得分:0)

您的XML需要一个标识行(正常的第一行),并且只有一个根节点对XMLReader有效且无错误地读取。

相关问题