2011-06-11 47 views
2

我有一些嵌套在span标签中的内容。其中一些有我需要拉的细节,有些则没有。我无法弄清楚如何检查两个选项并提取正确的数据。这些团体重复。例如:C#中的正则表达式条件问题

<span name="foo"> 
    <span name="bar"> 
     Missing Data 
    </span> 
</span> 
<span name="foo"> 
    <span name="bar"> 
     <span name="detail1">first detail</span> 
     <span name="detail2">second detail</span> 
    </span> 
</span> 

我必须单独捕捉细节,如果他们在那里,否则我需要设置这些值在我的程序字符串为null通过matchcollection循环时,所以我的代码需要设置strDetail1和strDetail2改为“”或值“第一个细节”和“第二个细节”(如果有意义的话)。

回答

2

我建议使用XPath来解析值。为了解析xml结构,这比Regex更可靠。

var xml = @" 
    <root> 
    <span name=""foo""> 
     <span name=""bar""> 
      Missing Data 
     </span> 
    </span> 
    <span name=""foo""> 
     <span name=""bar""> 
      <span name=""detail1"">first detail</span> 
      <span name=""detail2"">second detail</span> 
     </span> 
    </span> 
    </root> 
"; 

var document = XDocument.Parse(xml); 
var details = document.XPathSelectElements("//span[@name='foo']/span[@name='bar']/span[starts-with(@name,'detail')]") 
    .Select(arg => arg.Value) 
    .ToList(); 

或LINQ到XML

var details = document 
    .Descendants("span").Where(arg => arg.Attribute("name").Value == "foo") 
    .Elements("span").Where(arg => arg.Attribute("name").Value == "bar") 
    .Elements("span").Where(arg => arg.Attribute("name").Value.StartsWith("detail")) 
    .Select(arg => arg.Value) 
    .ToList(); 

[编辑]我可能误解了问题。看起来你也想要替换或填写一些值。只要你有XDocument,你可以用上述方法做到这一点。例如,这代码将清除detail1detail2元素的值:

var detailNodes = document.XPathSelectElements("//span[@name='foo']/span[@name='bar']/span[starts-with(@name,'detail')]") 
    .ToList(); 

detailNodes[0].Value = string.Empty; 
detailNodes[1].Value = string.Empty; 

var newXml = document.ToString(); 

[编辑]

如何添加元素:

var elementsWithMissingDetals = document 
    .XPathSelectElements("//span[@name='foo']/span[@name='bar' and count(*)=0]") 
    .ToList(); 

foreach (var elementsWithMissingDetal in elementsWithMissingDetals) 
{ 
    elementsWithMissingDetal.Add(
     new XElement("span", "first detail", new XAttribute("name", "detail1"))); 
    elementsWithMissingDetal.Add(
     new XElement("span", "second detail", new XAttribute("name", "detail2"))); 
} 

var newXml = document.ToString(); 
+1

1 - 的示例代码没有按” t解决他的整个问题(试图在循环中获取所有这些值),但是这个例子指出了OP在正确的方向。使用XML工具进行XML处理,并使用正则表达式对自定义文本进行正则表达式处理,但您还没有构建标准格式。 – 2011-06-11 04:25:57

+0

@Alex:在您上次编辑时,您是不是指LINQ到XML? – 2011-06-11 04:26:47

+0

@Merlyn Morgan-Graham - Typo。感谢您指出这一点。 – 2011-06-11 04:28:33