【问题标题】:How can I loop through a string, replacing sections that match a pattern?如何遍历字符串,替换与模式匹配的部分?
【发布时间】:2012-09-26 06:25:59
【问题描述】:

我有以下 HTML 标记

<p>xxxx</p>
 <pre>xxx</pre>
 <p>xxxx</p>
 <pre>yyy</pre>

我需要能够将其更改为:

<p>xxxx</p>
 <pre>ABC xxx ABC</pre>
 <p>xxxx</p>
 <pre>ABC yyy ABC </pre>

我有一个使用建议:

   var loDoc = XDocument.Parse(lcHTML);
   foreach (XElement loElement in loDoc.Descendants("pre"))

这确实提取了所有的 pre 元素,但它并没有给我一种将事物联系在一起并将代码重新插入原始字符串的方法。

是否有另一种方法可以让我进行所需的代码更改。我正在考虑在&lt;pre&gt;..&lt;/pre&gt; 上使用拆分和拆分,但这并不能真正给我我需要的东西,因为我需要替换&lt;pre&gt;...&lt;/pre&gt; 中的代码

【问题讨论】:

  • 听起来像是 [RegexMan][1] 的工作! (不过,我真的不知道您如何将正则表达式与 XDocument 一起使用...)[1]:xkcd.com/208
  • 我实际上宁愿不使用 XDocument。看起来有点矫枉过正,这实际上甚至不是一个有效的文档,因为它没有开始和结束 .

标签: c#


【解决方案1】:

一种可能是使用XDocument,但它必须是有效的XHTML,并且您需要引入一个根节点:

public class Program
{
    static void Main()
    {
        var doc = XDocument.Parse(
            @"<html>
              <p>xxxx</p>
              <pre>xxx</pre>
              <p>xxxx</p>
              <pre>yyy</pre>
            </html>"
        );
        foreach (var pre in doc.Descendants("pre"))
        {
            pre.Value = string.Format("ABC {0} ABC", pre.Value);         
        }
        Console.WriteLine(doc);
    }
}

另一种可能是使用Html Agility Pack:

public class Program
{
    static void Main()
    {
        var doc = new HtmlDocument();
        doc.LoadHtml(
            @"<p>xxxx</p>
              <pre>xxx</pre>
              <p>xxxx</p>
              <pre>yyy</pre>"
        );
        foreach (var pre in doc.DocumentNode.Descendants("pre"))
        {
            pre.InnerHtml = string.Format("ABC {0} ABC", pre.InnerHtml);         
        }
        Console.WriteLine(doc.DocumentNode.OuterHtml);
    }
}

【讨论】:

  • 谢谢达林,这样做是否仍然保留我原来的:

    xxxx

    以及所有
     元素之前和之后的代码?
  • 是的,它保留了它。它只会改变&lt;pre&gt; 元素的值。
  • 达林。我现在就试试这个。谢谢。
  • 达林,还在尝试这个。我在您的回答中注意到的一件事是评论“必须是有效的 XHTML”。这是否意味着如果我的来源意外包含一个

    而没有结束

    我会有问题?
【解决方案2】:

从此链接How to read HTML as XML?获取 XML Doc 元素

使用 doc 元素,试试

XmlElement root = doc.DocumentElement; 

XmlNodeList nodes = root.SelectNodes("pre"); 

foreach (XmlNode node in nodes) {
   node.value = "ABC" + node.value + "ABC";
} 

【讨论】:

  • T 这样做是否仍然保留我原来的:

    xxxx

    以及所有
     元素之前和之后的代码?
  • 这很简单,如 str = "ABC" + str + "ABC"。 str 的旧值在两边都附加了 ABC 并再次分配给 str。使用此 str 实例的任何代码。将具有新的价值。这里,node.value 会更新节点
  • 您能解释一下如何将我的数据放入 doc.DocumentElement 中吗?我遇到的一个问题是我的 XML 可能无效?
  • 无法理解你的问题。您的任务是获取“doc”变量。就这样。在我粘贴的代码中使用该 doc 变量。你应该得到你想要的输出。我还提供了获取 doc 变量的链接
【解决方案3】:

用字符串代替xml怎么样?

String xmlString = ... \\ get string representation from somewhere
xmlString = xmlString.Replace( "<pre>", "<pre>ABC " ); 
xmlString = xmlString.Replace( "</pre>", " ABC </pre>" ); 

【讨论】:

    猜你喜欢
    • 2014-03-22
    • 1970-01-01
    • 2021-01-26
    • 2014-08-31
    • 2020-07-20
    • 2019-03-20
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多