XML / XHTML替换内容?

时间:2010-05-24 01:29:56

标签: c# .net xml

我有一个XHTML字符串,我想替换标签 例如

<span tag="x">FOO</span> 
<span tag="y"> <b>bar</b> some random text <span>another span</span> </span>

我希望能够找到tag =“x”并用我自己的内容替换FOO 并找到tag = y并用自己的内容替换所有内部内容。

最好的方法是什么?我认为正则表达式绝对是不可能的。 XPATH可以这样做,还是只是为了搜索它可以进行操作吗?

2 个答案:

答案 0 :(得分:4)

如果您确定内容是XHTML(即格式良好的XML),那么XPath当然可以做到。

var doc = new XmlDocument();
doc.LoadXml("<span tag=...");

foreach(var node in doc.SelectNodes("//span[tag=x]"))
{
    node.InnerXml = "New Content";
}
foreach(var node in doc.SelectNodes("//span[tag=y]"))
{
    node.InnerXml = "Different Content";
}

答案 1 :(得分:0)

你肯定可以使用正则表达式(这是一个字符串操作),但这可能会有点讨厌,因为HTML可能非常复杂。但是,这当然是一种可能的方法。

另一种方法是将XHTML页面解析为一些结构化的hieararchy,然后进行处理。问题是页面是否真正有效的XML。 XHTML规范要求,但如果您从互联网上选择声称是XHTML的随机页面,您可能会遇到麻烦。

  • 如果不是,那么您需要将它们解析为HTML,这可以使用Html Agility Pack来完成。
  • 如果是,那么您可以将其视为XML并使用标准.NET类来解析它。

第二种情况可以使用LINQ to XML来完成:

var xs = from span in doc.Descendant("span")
         let tag = span.Attribute("tag")
         where tag != null && tag.Value == "x" select span;
forach(var x in xs) x.Value = "BAR!";

显而易见的好处是,这比使用正则表达式的解决方案更具可读性和可维护性。 Html Agility Pack提供了类似的API(虽然我不熟悉它来编写示例)。