C# XML/XHTML替换内容?

C# XML/XHTML替换内容?,c#,.net,xml,C#,.net,Xml,我有一个XHTML字符串,我想替换其中的标记 比如说 <span tag="x">FOO</span> <span tag="y"> <b>bar</b> some random text <span>another span</span> </span> FOO 在另一个跨距中添加一些随机文本 我希望能够找到tag=“x”并用我自己的内容替换FOO 并找到tag=y,将所有内部内容替换为by-

我有一个XHTML字符串,我想替换其中的标记 比如说

<span tag="x">FOO</span> 
<span tag="y"> <b>bar</b> some random text <span>another span</span> </span>
FOO
在另一个跨距中添加一些随机文本
我希望能够找到tag=“x”并用我自己的内容替换FOO 并找到tag=y,将所有内部内容替换为by-own内容

最好的方法是什么?我认为regex绝对是不可能的。
XPATH可以这样做还是仅仅为了搜索?它可以进行操作吗?

如果您确定内容是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";
}
var doc=new XmlDocument();

LoadXml(“如果您确定内容是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";
}
var doc=new XmlDocument();

LoadXml(您当然可以使用正则表达式(毕竟这是一种字符串操作),但这可能有点麻烦,因为HTML可能相当复杂。不过,这肯定是一种可能的方法

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

  • 如果没有,那么您需要将它们解析为HTML,这可以使用
  • 如果是,则可以将其视为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(尽管我不熟悉它来编写示例)。

使用正则表达式肯定可以做到这一点(毕竟这是一个字符串操作),但这可能有点令人讨厌,因为HTML可能相当复杂。然而,这肯定是一种可行的方法

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

  • 如果没有,那么您需要将它们解析为HTML,这可以使用
  • 如果是,则可以将其视为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和正则表达式时,必须将其链接起来:呵呵,很好的参考:-),但在某些情况下,我会使用正则表达式(如果它不是真正的XML,我需要快速的破解而不是解决方案)对我来说,一句话中的“不能”和“正则表达式”表明应该有一个证明;-)@John Saunders:我知道他是指“XHTML”,但这就是所谓的“web标准”的世界@Tomas:我认为有一个相当大的机会,称自己为XHTML的东西在某个时候会被XML解析器使用,如果它不是有效的XML,就会告诉你。我认为没有理由建议在解析XHTML时使用正则表达式是有效的。。正则表达式是不行的。当在同一个答案中提到HTML和正则表达式时,必须将其链接起来:呵呵,很好的参考:-),但在某些情况下,我会使用正则表达式(如果它不是真正的XML,我需要一个快速的解决方案,而不是实实在在的解决方案)。标题应该是“如果你使用正则表达式,你会被烧死”。对我来说,一句话中的“不能”和“正则表达式”表明应该有证据;-)@约翰·桑德斯:我知道他的意思是“XHTML”,但这是所谓的“web标准”的世界。@Tomas:我认为有一个相当大的机会,称自己为XHTML的东西在某个时候会被XML解析器使用,如果它不是有效的XML,它会告诉你。我认为没有理由建议在解析XHTML时使用正则表达式来迷惑读者。谢谢您的回答和示例代码。非常感谢您的回答和示例代码。非常感谢