是否适合使用正则表达式解析XML?

时间:2012-04-18 17:08:09

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

我正在开发一个插入另一个项目的项目。我正在插入的项目产生了一种奇怪的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。奇怪的Elt元素可以随机出现次数,就像它上面的元素Child-Which-Can-Occur-Random-Number-Of-Times一样。

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

我是对的吗?

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

是的,你是对的。您必须使用Linq to SQL和RegularExpression。这是样本

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;

希望它有所帮助。