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

Tor*_*mod 1 c# xml linq-to-xml

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

像这样:

<SomeElement SomeAtt="SomeValue"><SomeChild/></SomeElement> More random text.
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

编辑

  • 附加信息:随机文本可能包含尖括号。
  • 附加信息:从概念上讲,XML可能包含xml注释,其中可能包含不匹配的括号。因此,希望解决方案考虑到这一点,以使其普遍适用,但在我的特定情况下不是必需的。

har*_*r07 5

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

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());
Run Code Online (Sandbox Code Playgroud)

控制台输出:

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

 More random text.
Run Code Online (Sandbox Code Playgroud)