7

我正在尝试使用 c# 在 xml 文件中查找和替换文本。我想要的是在整个文件的 url 链接中更改服务器名称。

http://Server1.extranet.abc/server1webdev/rest/services/ABC/ABC_Base/MapServer

http://Server2.extranet.abc/server1webdev/rest/services/ABC/ABC_Base/MapServer 

我尝试使用 System.xml.linq (XDocument.load(xmlpath)) 但它只是将整个 xml 文件作为一行字符串提供给我。有没有办法可以替换文本?请注意,网址不在特定节点中。它们在整个文件中是随机的。我可以通过文件的查找和替换手动执行此操作,有没有办法以编程方式执行此操作?

4

3 回答 3

10

如果您将整个 xml 文件作为字符串,您可以通过执行以下操作替换您需要的内容:

string oldStr = @"http://Server1.extranet.abc/server1webdev/rest/services/ABC/ABC_Base/MapServer";
string newStr = @"http://Server2.extranet.abc/server1webdev/rest/services/ABC/ABC_Base/MapServer ";

doc.Replace(oldStr, newStr);

但通常,如果您想更改 xml 中标记的值,我可以建议一个示例,然后将其用于您的 xml:

     XDocument doc = XDocument.Load("D:\\tst.xml");
     foreach (XElement cell in doc.Element("Actions").Elements("Action"))
     {
        if (cell.Element("ActionDate").Value == oldStr)
        {
           cell.Element("ActionDate").Value = newStr;
        }
     } 

     doc.Save("D:\\tst.xml");
于 2013-09-11T15:03:38.170 回答
0

使用 XDocument 目前没有内置方法来替换整个文件中的文本。但是你能做的是

XDocument document = XDocument.LoadFrom(path);
var docText = document.ToString().Replace(urlA, urlB);
using (var reader = new StringReader(docText))
    document = XDocument.Load(reader, LoadOptions.None);

这并不理想,但至少这是一种解决方法。

于 2020-10-21T09:15:47.163 回答
0
List<XElement> allElements = xmlDocument.Descendants().ToList();
foreach (XElement element in allElements.Where(e => e.Value == oldstring))
{
    element.Value = newstring
}

替代Where子句可以有一个Contains并且Value可以使用字符串替换。

加载 XDocument 时保留行号的小技巧,如果您正在进行验证,这将非常方便:

XDocument xmlDocument = XDocument.Load(xmlFile, LoadOptions.SetLineInfo);
于 2021-02-25T18:05:46.190 回答