【问题标题】:Extract Xml Element from a larger string从较大的字符串中提取 Xml 元素
【发布时间】:2015-04-25 22:36:48
【问题描述】:

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

像这样:

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

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

有什么想法吗?

编辑

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

【问题讨论】:

  • 您的 XML 中有错误,这就是 XMLreader 给出异常的原因。您应该修复错误,而不是寻找解决这些错误的方法。
  • 您现在可以使用 XElement.Parse 读取文件吗?您需要其他帮助吗?
  • 不,XElement.Parse 会抱怨“更多随机文本”。部分。具体来说,它会抛出异常“根级别的数据无效”。如果你看到 har07 的答案的评论部分,可能会更清楚问题是什么。
  • 我的意思是“不”,如“我无法使用 XElement.Parse 阅读文本”。并且“是的,如果你有一个好的解决方案,我想听听”。

标签: c# xml linq-to-xml


【解决方案1】:

一种可能的简单方法是将整个字符串包装在根节点中,使其成为有效的 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.

【讨论】:

  • 这是一个聪明的解决方案。但它不需要我以某种方式转义随机文本以使其有效 XText 吗?
  • 没错,如果你真的遇到这种情况,那么恐怕你将不得不另谋出路。我认为在这种情况下的问题是,您不想转义但随机文本(否则,XML 部分中的 fe、&amp;gt; 将转义为&amp;gt;),因此您需要将随机文本分开XML 部分的文本。这就是最初的问题:(
  • 据我所知,没有 XML 解析库可以处理无效的 XML,或者在有效部分的末尾停止解析。甚至XmlReaderReadSubtree() 都没有,从我读到的内容来看,它应该读取更大的valid XML 树 的子树
  • 是的,这就是我目前的状态。看来我必须求助于尖括号计数并对 XML cmets 进行特殊处理,这样它们就不会影响我的计数。不过很遗憾,因为标准库解析器已经这样做了。
  • 是的,确实如此。所以我有起始括号。但是您如何建议我在不进行括号计数的情况下识别 XElement 的右括号?随机文本也可以包含括号。
【解决方案2】:

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

【讨论】:

  • 输入的数据不是xml。输入数据是一个字符串,其中该字符串以 Xml 元素作为带有元数据的标头开始。我的问题是如何从其余输入数据中提取 Xml 元素,最好使用 .NET BCL 中现有的 XML 感知解析器。问题是在读取 Xml 元素后让它们“停止”。
猜你喜欢
  • 2013-12-10
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多