【问题标题】:XML/XHTML replace content?XML/XHTML 替换内容?
【发布时间】:2010-05-24 09:52:18
【问题描述】:

我有一个 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 可以这样做还是仅仅为了搜索可以进行操作?

【问题讨论】:

    标签: c# .net xml


    【解决方案1】:

    如果您确定内容是 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";
    }
    

    【讨论】:

    • 感谢您的回答以及示例代码。非常感谢
    【解决方案2】:

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

    另一种方法是将 XHTML 页面解析为一些结构化的层次结构,然后进行处理。问题是这些页面是否是真的有效的 XML。 XHTML 规范要求这样做,但如果您从 Internet 上随机选择声称是 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(虽然我不熟悉它来写一个示例)。

    【讨论】:

    • No你不能用正则表达式来做到这一点
    • 当在同一个答案中提到 HTML 和 RegEx 时,必须链接:stackoverflow.com/questions/1732348/…
    • 呵呵,很好的参考 :-),但有种情况我会使用正则表达式(如果不是真的 XML 和我需要快速破解而不是可靠的解决方案)。标题应该真的是如果你使用正则表达式,你会在地狱中燃烧。对我来说,一句话中的“不能”和“正则表达式”表明应该有一个证明;-)
    • @John Saunders:我明白他的意思是“XHTML”,但这是所谓的“网络标准”的世界。
    • @Tomas:我认为自称为 XHTML 的东西很有可能会在某个时候被 XML 解析器使用,如果它不是有效的 XML,它会告诉你。我认为没有理由通过建议在解析 XHTML 时使用正则表达式的有效时间来混淆读者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2014-10-28
    • 2017-02-25
    相关资源
    最近更新 更多