将 TinyXml2 代码移植到 C# XmlDocument 以替换元素中的文本值

Porting TinyXml2 code to C# XmlDocument to replace text values in elements

使用 TinyXml2 我可以像这样更改所有元素的文本值:

void CAssignHistoryDlg::UpdateNameAssignHistXML(tinyxml2::XMLElement* pElement, CString strExistingName, CString strReplacementName)
{
    TIXMLASSERT(pElement);

    USES_CONVERSION;

    if (pElement != NULL)
    {
        CString strText(CA2CT(pElement->GetText(), CP_UTF8));
        if (strText.CollateNoCase(strExistingName) == 0)
            pElement->SetText(CT2CA(strReplacementName, CP_UTF8));
    }

    for (tinyxml2::XMLElement* pChildElement = pElement->FirstChildElement(); pChildElement != NULL; pChildElement = pChildElement->NextSiblingElement()) {
        UpdateNameAssignHistXML(pChildElement, strExistingName, strReplacementName);
    }
}

但是如果我改用 C# 和 XmlDocument,我该如何做同样的事情呢?我只是想读取 XML 文件,找到文本值为 AAA 的任何元素并将其替换为 BBB 然后保存是吗?

谢谢。

您可以查看此文档以获取更多信息:https://msdn.microsoft.com/en-us/library/system.xml.linq.xelement(v=vs.110).aspx

var doc =
    new XElement("root",
        new XElement("first", "old"),
        new XElement("Second",
            new XElement("Third", "old")
        )
    );

string oldValue = "old";
string newValue = "new";

ReplaceValue(doc, oldValue, newValue);

方法定义如下:

public void ReplaceValue(XElement element, string oldValue, string newValue)
{
    if (element.HasElements)
    {
        foreach (var elem in element.Descendants())
        {
            ReplaceValue(elem, oldValue, newValue);
        }
    }
    else if (element.Value == oldValue)
    {
        element.Value = newValue;
    }
}

要将文件读入 XElement,请使用 XElement.Load("C:\file.xml"),要保存,请使用 XElement.Save("C:\file.xml")