【问题标题】:How do I replace multiple tags in a string based on conditions?如何根据条件替换字符串中的多个标签?
【发布时间】:2019-03-12 22:30:34
【问题描述】:

我有一个 XML 文件,我需要在主进程之前做一些替换,所以我使用StringBuilder 逐行读取并进行必要的更改。其中之一如下:

我的字符串是: <para>This<brk/>is<brk/>a<brk/>bold tag.</para> // Simple Input

我将每个分隔成一个新行。所以每个都是:

<para>This</para> <para>is</para> <para>a</para> <para>bold tag.</para>

现在,如果我在 &lt;para&gt; 标记中有 &lt;bold&gt;&lt;italic&gt; 标记,那么理想情况下应该是: &lt;para&gt;&lt;bold&gt;This&lt;brk/&gt;is&lt;brk/&gt;a&lt;brk/&gt;bold tag.&lt;/bold&gt;&lt;/para&gt; // Main Input

但在我的情况下,我必须将每一行分隔成单独的行,所以这将是无效的语法。根据我的要求,应该是: &lt;para&gt;&lt;bold&gt;This&lt;/bold&gt;&lt;brk/&gt;&lt;bold&gt;is&lt;/bold&gt;&lt;brk/&gt;&lt;bold&gt;a&lt;/bold&gt;&lt;brk/&gt;&lt;bold&gt;bold tag.&lt;/bold&gt;&lt;/para&gt; // Required Input

如何检查每个&lt;brk/&gt; 标签以确保每个&lt;brk/&gt; 都被&lt;bold&gt;&lt;brk/&gt;&lt;/bold&gt; 替换。

问题是&lt;bold&gt; 标签可以出现在字符串中的任何位置。例如: &lt;para&gt;&lt;bold&gt;This&lt;/bold&gt; again&lt;brk/&gt; is&lt;brk/&gt;&lt;bold&gt; a &lt;brk/&gt;paragraph&lt;/bold&gt;&lt;/para&gt; // Another Input

现在,如果我根据我使用的拆分规则拆分它,它将变为: <para><bold>This</bold>again</para> <para>is</para> <para><bold>a</para> // Line 1 <para>bold tag.</bold></para> // Line 2

Line 1Line 2 是无效的 XML 行。

在这种情况下,输出将是: &lt;para&gt;&lt;bold&gt;This&lt;/bold&gt; again&lt;brk/&gt; is&lt;brk/&gt;&lt;bold&gt; a &lt;/bold&gt;&lt;brk/&gt;&lt;bold&gt;paragraph&lt;/bold&gt;&lt;/para&gt;.

如果我不进行此替换,XML 将无效,因为我必须在每个 &lt;brk/&gt; 标记处将字符串拆分为新行。

【问题讨论】:

  • 除非您使用蹩脚的第三方接口,否则没有必要将 XML 节点分隔在不同的行中。 .NET XML 相关类工作正常,没有换行符。
  • 实际上,我正在开发一个应用程序,这是必需的,所以我将一个 XML 文件作为输入并检查一些标签。然后,我将根据需要更换它们。这是要求之一。
  • this 有帮助吗?我不确定是否理解您的问题。
  • 为什么不使用与 XML 相关的类?通过递归和替换 XML 节点内部文本,&lt;brk/&gt; 逻辑可以相当容易地完成。
  • @PrimoChalice 我会仔细检查您的要求,因为单行 XML 与格式良好的 XML...它仍然是有效的 XML

标签: c# .net


【解决方案1】:

不是最有效的解决方案,但您可以尝试一下:

string FormatLine(string xmlLine)
{
    var xmlBoldLine = GetFormattedString(xmlLine, "bold");
    var xmlitalicLine = GetFormattedString(xmlBoldLine, "italic");

    return xmlitalicLine;
}

string GetFormattedString(string xmlLine, string tag)
{
    if (xmlLine.Contains(tag))
    {
        return "<" + tag + ">" + xmlLine.Replace(tag, "") + "</" + tag + ">";
    }

    return xmlLine;
}

【讨论】:

    【解决方案2】:

    您不应该使用字符串方法来修改 xml。使用如下所示的 Xml Linq 等标准 Net Xml 库之一

    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Xml;
    using System.Xml.Linq;
    
    
    
    namespace ConsoleApplication104
    {
        class Program
        {
    
    
             static void Main(string[] args)
            {
                string xml = "<root><para>This<brk/>is<brk/>a<brk/>bold tag.</para></root>";
    
                XElement root = XElement.Parse(xml);
    
                XElement para = root.Element("para");
    
                List<XElement> children = para.Elements().ToList();
                foreach (XElement child in children)
                {
                    root.Add(new XElement("para", child.NextNode.ToString()));
                }
                 children.Remove();
    
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-19
      • 2022-08-12
      • 2013-11-19
      • 2021-10-07
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 2015-05-06
      相关资源
      最近更新 更多