【问题标题】:Regex to remove xml declaration from a string正则表达式从字符串中删除 xml 声明
【发布时间】:2010-11-08 15:26:30
【问题描述】:

首先,我知道这是一个糟糕的解决方案,我不应该这样做。

背景:随意跳过


但是,我需要快速修复实时系统。我们目前有一个数据结构,它通过一系列字符串构建器创建“xml”片段,将自身序列化为字符串。这是否是有效的 XML 我相当怀疑。在创建这个 xml 之后,在通过消息队列发送它之前,一些清理代码会在字符串中搜索 xml 声明的出现并删除它们。

这样做的方式(迭代每个字符为<?xml 执行 indexOf)非常慢,导致线程超时并杀死我们的系统。最终我会尝试正确修复这个问题(使用 xml 文档或类似的东西构建 xml),但今天我需要一个快速修复来替换那里的内容。

请记住,我知道这远非理想的解决方案,但我需要快速修复以使我们恢复正常运行。


问题

我想使用正则表达式来查找声明。我打算:<\?xml.*?>,然后使用Regex.Replace(input, string.empty) 删除。

如果这个正则表达式有任何明显的问题,您能否告诉我,或者只是在代码中使用 string.IndexOf("<?xml")string.IndexOf("?>") 对在(更明智的)循环中编写它更好。

编辑 我需要处理换行符。

会:<\?xml[^>]*?> 解决问题吗?

EDIT2

感谢您的帮助。正则表达式明智 <\?xml.*?\?> 工作正常。我最终编写了一些计时代码并使用 ar egex 和 IndexOf() 进行了测试。我发现,对于我们最简单的用例,只需声明剥离即可:

  • 几乎一秒钟
  • .01 秒的正则表达式
  • 无法使用循环和IndexOf()

所以我选择了IndexOf(),因为它是一个非常简单的循环。

【问题讨论】:

  • 首先检查它是否实际上是有效的 XML - 如果是这样,那么会有更好且仍然有效的答案。是否有过 XSD 的尝试?
  • @annakata:没有 XDS,这一切都只是手写/拼凑在一起,或者看起来是这样。我怀疑如果尝试解析它会发生的第一件事是由于多个 xml 声明而失败。最终,我的计划是让每个类将自身序列化为 VIA 一个 XmlDoc 或等效字符串,以获取有效的 XML。
  • 它可能会失败,但第一步是检查,第二件事是仔细检查诸如 beautifulsoup 之类的东西不会拯救你。

标签: c# xml regex tidy


【解决方案1】:

您可能想要这个:<\?xml.*\?> 或这个:<\?xml.*?\?>,因为按照您现在的方式,正则表达式不是在寻找“?>”,而只是寻找“>”。我不认为你想要第一个选项,因为它很贪婪,它会删除第一次出现 '' 之间的所有内容。只要您没有嵌套的 XML 标记,第二个选项就可以工作。如果这样做,它将删除第一个“”之间的所有内容。如果你有另一个''标签。

另外,我不知道 .NET 中的正则表达式是如何实现的,但我严重怀疑它们是否比使用 indexOf 更快。

【讨论】:

  • 谢谢。我只是添加 /i 修饰符以使其不区分大小写。 /<\?xml.*\?>/i
  • @ArthurShlain xml 标签区分大小写。您可能有充分的理由超越规范,但我们仍然应该承认这一点。 /i 匹配的内容超出了 XML 解析器所允许的范围。
【解决方案2】:
strXML = strXML.Remove(0, sXMLContent.IndexOf(@"?>", 0) + 2);

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 2021-09-07
    • 2017-08-24
    • 2012-03-21
    • 2018-11-20
    相关资源
    最近更新 更多