【问题标题】:Replace a string in an XML string替换 XML 字符串中的字符串
【发布时间】:2015-01-01 18:56:52
【问题描述】:

我有一个如下所示的字符串:

newNodeXML = "<item id="qDf73w8emTg" parent_id="weLPzE243de" type="suite">
                 <content>
                    <name>Three</name>
                 </content>
              </item>"

在我的 [WebMethod] 中,我尝试像这样替换 parent_ID(在运行时随机生成):

Regex myRegex = new Regex(@""" parent_id=""(.*?)"" type=""");
newNodeXML = myRegex.Replace(newNodeXML, "d43df2qT45");

请注意,例如/演示,我在上面的第二行中使用了“d43df2qT45”。我实际上也会随机生成。

我的问题是这样的结果。 我不想这样:

<item id="qDf73w8emTgd43df2qT45suite">
   <content>
      <name>Three</name>
   </content>
</item>

相反,这就是我想要它的样子:

<item id="qDf73w8emTg" parent_ID="d43df2qT45" type="suite">
   <content>
      <name>Three</name>
   </content>
</item>

附:我尝试了一些示例/谷歌搜索,我能找到的只是让我走到这一步的示例。

【问题讨论】:

  • Regex 可能是错误的做法。查看stackoverflow.com/questions/2424613/…
  • parent_id 值的长度是否固定且事先已知?
  • 你为什么不反序列化这个内容,改变你需要的然后再序列化它?
  • 您是否专门寻找正则表达式解决方案?
  • 我可以用任何解决方案来解决这个问题。不必专门的正则表达式。但我猜@Guffa 的回答刚刚奏效。如果有人认为正则表达式不是解决此问题的最有效方法,请随时提出替代方案。

标签: c# regex replace


【解决方案1】:

如果您有已知的 XML 结构,使用 XML 工具可能比使用 refex 更好,而且速度也更快。例如:

var doc = XDocument.Parse(newNodeXML);
doc.Root.Attribute("parent_id").Value = "xyz";

此代码依赖于您提供的确切结构。所以只有一个item,它是一个XML文件的根,它有一个名为parent_id的属性。

更多关于XDocument类型MSDN

【讨论】:

  • 实际上,使用正则表达式的速度大约是解析 XML 字符串的两倍。
  • @Guffa 我没有测试过,你可能适合这种特殊情况。但根据我的经验,对于较大的文档,XML 的性能比正则表达式要好得多。但是速度并不是我不使用正则表达式的唯一原因。可读性是另一个。此外,我一直在尝试提出 OP 可能不知道的解决方案,以便向他学习新知识:)
【解决方案2】:

由于您已经对所有内容进行了硬编码,因此确实不需要使用捕获组。
只需将替换扩展到此:

"\" parent_id=\"" + "d43df2qT45" + "\" type=\""

【讨论】:

    【解决方案3】:

    你可以试试这个,我测试过,它似乎工作:

    String newXml = Regex.Replace(xml, "parent_id=\".+\" ", "parent_id=\"" + newID + "\" ");
    

    这是一个测试它的示例方法:

    String xml = "<item id=\"qDf73w8emTg\" parent_id=\"weLPzE243de\" type=\"suite\">\n\t<content>\n\t\t<name>Three</name>\n\t</content>\n</item>";
    String newID = "This is the new parent_Id";
    Console.WriteLine("Old xml: \n\n" + xml + "\n\n\nNew xml:\n");
    String newXml = Regex.Replace(xml, "parent_id=\".+\" ", "parent_id=\"" + newID + "\" ");
    Console.WriteLine(newXml);
    Console.ReadKey();
    

    只需将其粘贴到控制台应用程序的 main 方法中,并包含正则表达式库:)

    【讨论】:

      【解决方案4】:

      您可以通过使用下面的正则表达式来将正则表达式用于您想做的事情。

      Regex myRegex = new Regex("parent_id=\"([^""]+)\");
      string myXml = "<myxml>data</myxml>";
      xdoc.LoadXml(myXml);
      

      【讨论】:

        【解决方案5】:

        您可以使用括号来捕获值之前和之后的部分,然后使用$1$2 将它们包含在替换中:

        Regex myRegex = new Regex(@"( parent_id="")[^""]+("")");
        newNodeXML = myRegex.Replace(newNodeXML, "$1" + "d43df2qT45" + "$2");
        

        你也可以只使用字符串操作:

        int pos1 = newNodeXML.IndexOf(" parent_id=\"") + 12;
        int pos2 = newNodeXML.IndexOf('"', pos1);
        newNodeXML = newNodeXML.Substring(0, pos1) + "d43df2qT45" + newNodeXML.Substring(pos2);
        

        【讨论】:

          猜你喜欢
          • 2018-12-13
          • 2013-01-04
          • 2012-04-03
          • 1970-01-01
          • 2013-07-23
          • 2013-11-05
          • 2011-10-20
          相关资源
          最近更新 更多