【问题标题】:Is it ever appropriate to parse XML with Regular expressions?使用正则表达式解析 XML 是否合适?
【发布时间】:2012-04-18 17:08:09
【问题描述】:

我正在从事一个项目,该项目可以插入另一个项目。我正在参与的项目产生了一种奇怪的 XML 语法,无法更改。

它有一个奇怪的元素来说明

<DocumentRoot>
   <Parent>
      <Child-Which-Can-Occur-Random-Number-Of-Times> Data </Child-Which-Can-Occur-Random-Number-Of-Times>
      <Weird-Elt_12309843028938> Data I need </Weird-Elt_12309843028938>
      <Weird-Elt_84509843323232> Data I need </Weird-Elt_84509843323232>

   </Parent>
   <Parent>
      <Child-Which-Can-Occur-Random-Number-Of-Times> Data </Child-Which-Can-Occur-Random-Number-Of-Times>
      <Weird-Elt_12309843028938> Data I need </Weird-Elt_12309843028938>
   </Parent>
   <Parent>
      <Child-Which-Can-Occur-Random-Number-Of-Times> Data </Child-Which-Can-Occur-Random-Number-Of-Times>
      <Weird-Elt_12309843028938> Data I need </Weird-Elt_12309843028938>
   </Parent>
</DocumentRoot>

我需要什么:“Weird-Elt”标签的名称,以及它的内容。

问题:无法更改 XML。 Weird-Elt 元素可以出现随机次数,它上面的元素 Child-Which-Can-Occur-Random-Number-Of-Times 也是如此。

我能看到的唯一解决方案是使用 Linq to XML 结合正则表达式来匹配 Weird-Elt 的名称。

我对吗?

【问题讨论】:

  • 为什么不能改语法?如果你的 XML 不能被 XML parser 解析,那么你的设计就有缺陷。
  • stackoverflow.com/a/1732454/63011 我想这同样适用于 XML
  • 不,你不应该需要正则表达式。访问“parent”.lastChild 怎么样?
  • @Bergi 在他的示例中,每个父级有超过 1 个 &lt;Weird-Elt&gt; 标签,因此使用 lastChild 将不起作用。
  • 你怎么知道你想要哪个元素?

标签: c# xml regex linq linq-to-xml


【解决方案1】:
var nodeList = xmlDoc.DocumentElement.SelectNodes("//*[starts-with(name(),'Weird-Elt_')]");

如果名称不总是以 Weird-Elt_ 开头,请尝试 contains

var nodeList = xmlDoc.DocumentElement.SelectNodes("//*[contains(name(),'Weird-Elt_')]");

【讨论】:

  • 它并不总是以 Weird-Elt_ 开头!对不起,我应该澄清这一点:)
【解决方案2】:

是的,你是对的。您将不得不使用带有正则表达式的 Linq to SQL。这是示例

Regex regEx = new Regex("Weird-Elt_.*", RegexOptions.Compiled);

XDocument doc = XDocument.Parse(xml1);
var x1 = from e in doc.Descendants("Parent").Descendants()
         where regEx.IsMatch(e.Name.LocalName)
        select e;

希望对你有帮助。

【讨论】:

  • 或者你可以使用 e.Name.LocalName.StartsWith
  • 不是必须的,但是这个解决方案可以工作,虽然 string.StartsWith 会比 Regex.IsMatch 快很多。
猜你喜欢
  • 2012-01-25
  • 1970-01-01
  • 2015-04-29
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多