我建议使用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
,你可以用上述方法做到这一点。例如,这代码将清除detail1
和detail2
元素的值:
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 - 的示例代码没有按” t解决他的整个问题(试图在循环中获取所有这些值),但是这个例子指出了OP在正确的方向。使用XML工具进行XML处理,并使用正则表达式对自定义文本进行正则表达式处理,但您还没有构建标准格式。 – 2011-06-11 04:25:57
@Alex:在您上次编辑时,您是不是指LINQ到XML? – 2011-06-11 04:26:47
@Merlyn Morgan-Graham - Typo。感谢您指出这一点。 – 2011-06-11 04:28:33