替换 XML 字符串中的字符串
Replace a string in an XML string
我有一个看起来像这样的字符串:
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");
请注意,为了 example/demo 的缘故,我在上面的第二行中使用了 'd43df2qT45'。我实际上也会随机生成它。
我这里的问题就是这样出来的结果。
我不想这个:
<item id="qDf73w8emTgd43df2qT45suite">
<content>
<name>Three</name>
</content>
</item>
相反,这就是我想要的样子:
<item id="qDf73w8emTg" parent_ID="d43df2qT45" type="suite">
<content>
<name>Three</name>
</content>
</item>
P.S。我已经尝试了一些 examples/google 搜索,我所能找到的都是让我走到这一步的例子。
你可以用括号把值前后的部分截下来,然后用</code>和<code>
把它们包括在替换中:
Regex myRegex = new Regex(@"( parent_id="")[^""]+("")");
newNodeXML = myRegex.Replace(newNodeXML, "" + "d43df2qT45" + "");
您也可以仅使用字符串操作来完成:
int pos1 = newNodeXML.IndexOf(" parent_id=\"") + 12;
int pos2 = newNodeXML.IndexOf('"', pos1);
newNodeXML = newNodeXML.Substring(0, pos1) + "d43df2qT45" + newNodeXML.Substring(pos2);
如果您有已知的 XML 结构,使用 XML 工具可能比使用 refex 更好,而且速度也更快。例如:
var doc = XDocument.Parse(newNodeXML);
doc.Root.Attribute("parent_id").Value = "xyz";
此代码依赖于您提供的确切结构。所以只有一个 item
,它是 XML 文件的根,它有一个名为 parent_id
.
的属性
关于 XDocument
类型的更多信息 MSDN。
既然你已经硬编码了一切,真的没有必要使用捕获组。
只需将替换扩展到此:
"\" parent_id=\"" + "d43df2qT45" + "\" type=\""
你可以试试这个,我测试过它似乎有效:
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();
只需将其粘贴到控制台应用程序的主要方法中,并包含 RegularExpression 库:)
您可以通过使用如下所示的正则表达式来使用正则表达式来完成您想做的事情。
Regex myRegex = new Regex("parent_id=\"([^""]+)\");
string myXml = "<myxml>data</myxml>";
xdoc.LoadXml(myXml);
我有一个看起来像这样的字符串:
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");
请注意,为了 example/demo 的缘故,我在上面的第二行中使用了 'd43df2qT45'。我实际上也会随机生成它。
我这里的问题就是这样出来的结果。 我不想这个:
<item id="qDf73w8emTgd43df2qT45suite">
<content>
<name>Three</name>
</content>
</item>
相反,这就是我想要的样子:
<item id="qDf73w8emTg" parent_ID="d43df2qT45" type="suite">
<content>
<name>Three</name>
</content>
</item>
P.S。我已经尝试了一些 examples/google 搜索,我所能找到的都是让我走到这一步的例子。
你可以用括号把值前后的部分截下来,然后用</code>和<code>
把它们包括在替换中:
Regex myRegex = new Regex(@"( parent_id="")[^""]+("")");
newNodeXML = myRegex.Replace(newNodeXML, "" + "d43df2qT45" + "");
您也可以仅使用字符串操作来完成:
int pos1 = newNodeXML.IndexOf(" parent_id=\"") + 12;
int pos2 = newNodeXML.IndexOf('"', pos1);
newNodeXML = newNodeXML.Substring(0, pos1) + "d43df2qT45" + newNodeXML.Substring(pos2);
如果您有已知的 XML 结构,使用 XML 工具可能比使用 refex 更好,而且速度也更快。例如:
var doc = XDocument.Parse(newNodeXML);
doc.Root.Attribute("parent_id").Value = "xyz";
此代码依赖于您提供的确切结构。所以只有一个 item
,它是 XML 文件的根,它有一个名为 parent_id
.
关于 XDocument
类型的更多信息 MSDN。
既然你已经硬编码了一切,真的没有必要使用捕获组。
只需将替换扩展到此:
"\" parent_id=\"" + "d43df2qT45" + "\" type=\""
你可以试试这个,我测试过它似乎有效:
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();
只需将其粘贴到控制台应用程序的主要方法中,并包含 RegularExpression 库:)
您可以通过使用如下所示的正则表达式来使用正则表达式来完成您想做的事情。
Regex myRegex = new Regex("parent_id=\"([^""]+)\");
string myXml = "<myxml>data</myxml>";
xdoc.LoadXml(myXml);