首页 > 解决方案 > 通过 C# 读取和编辑 XML 文件中的特定 XML 代码

问题描述

我正在尝试在 C# 中创建一个程序,该程序将打开一个文件中提到的几个 XML 文件Main.xml,查找某些名称标签,并为它们添加一个后缀(blabla_name, Blabla_unit_name, Location_code, WO_Name)。问题是名称是关系属性,根据它们所在的文件具有不同的标签。例如,它可能<Structure_name>structure.xml文件中,但也可能<From_structure_name>equipment.xml文件中。

因此,我所做的是创建一个 XML 解析程序,该程序将从Main.XML文件中获取所有链接,打开每个文件,读取并找到我正在寻找的名称标签,并将它们的值 ( innertext) 保存在字符串列表中. 目的是,在读取并存储列表中的所有必需值之后,我想逐个索引迭代每个文件的索引,并替换另一个文件列表innertext中的值。<structure_name> && <from_structure_name>例如,使用新值 + 后缀。

我已经完成了几乎 80% 的工作,但我正在努力解决的问题是后缀被添加了不止一次。那是因为我想不出一个条件将写入方法限制为仅在读取过程完成后执行,但同时也在每个文件上执行。

这是我的代码:

private void button2_Click(object sender, EventArgs e)
{
    if (textBox1.Text == null)
        MessageBox.Show("Please choose a folder");
    else
    {
        string postfix = textBox2.Text;
        string location = textBox3.Text;
        string workOrder = textBox4.Text;

        List<string> contentList = new List<string>();

        if ((postfix.Length > 0) && (postfix.Length <= 2))
        {
            List<string> nameList = new List<string>();
            List<string> unitNameList = new List<string>();
            List<string> locationList = new List<string>();
            List<string> workOrderList = new List<string>();

            List<string> fileContents = new List<string>();
            // Load the document.
            String folderPath = textBox1.Text;
            XmlDocument doc = new XmlDocument();
            doc.Load(folderPath + "\\Main.xml");
            int i = 0;
            XmlNode root = doc.FirstChild.NextSibling;
            XmlNodeList tree = root.ChildNodes;
            List<string> mainList = new List<string>();

            foreach (XmlNode node in tree)
            {
                mainList.Add(tree.Item(i).InnerText);
                string name = mainList[i];
                var fileName = folderPath + "\\" + name;

                XmlDocument doc1 = new XmlDocument();
                doc1.Load(fileName);

                GetName(fileName, nameList);
                if (nameList.Count > 0 )
                    ReplaceText(fileName, nameList, postfix);

                GetUnitName(fileName, unitNameList);
                if (unitNameList.Count > 0)
                    ReplaceText(fileName, unitNameList, postfix);

                GetLocation(fileName, locationList);
                if (locationList.Count > 0)
                    ReplaceText(fileName, locationList, location);

                GetWorkOrder(fileName, workOrderList);
                if (workOrderList.Count>0)
                   ReplaceText(fileName, workOrderList, workOrder);

                i++;
            }
        }
        else
        {
            MessageBox.Show("Please enter atleast 1 character or 2 at maximum for the postfix.");
        }
    }
}

public void GetName(string url, List<string> list)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(url);
    string search = Path.GetFileNameWithoutExtension(url);
    XmlNodeList nodeList = doc.GetElementsByTagName(search + "_NAME");
    List<string> innerList = new List<string>();
    try
    {
        if (nodeList.Count > 0)
        {
            int i = 0;
            while (i < nodeList.Count)
            {
                if (nodeList.Item(i) != null)
                {
                    var xmlNode = nodeList.Item(i);
                    if (xmlNode != null) innerList.Add(xmlNode.InnerText);
                        string oldName = innerList[i];
                    list.Add(oldName);
                    i++;
                }
            }

        }
    }
    catch
    {
    }
}

public void GetUnitName(string url, List<string> list)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(url);
    string search = Path.GetFileNameWithoutExtension(url);
    XmlNodeList nodeList = doc.GetElementsByTagName(search + "_UNIT_NAME");
    List<string> innerList = new List<string>();

    if (nodeList.Count > 0)
    {
        int i = 0;
        while (i < nodeList.Count)
        {
            if (nodeList.Item(i) != null)
            {
                var xmlNode = nodeList.Item(i);
                if (xmlNode != null) innerList.Add(xmlNode.InnerText);
                    string oldName = innerList[i];
                list.Add(oldName);
                i++;
            }
        }

    }
}

public void GetLocation(string url, List<string> list)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(url);
    string search = Path.GetFileNameWithoutExtension(url);
    XmlNodeList nodeList = doc.GetElementsByTagName("LOCATION_CODE");
    List<string> innerList = new List<string>();
    try
    {
        if (nodeList.Count > 0)
        {
            int i = 0;
            while (i < nodeList.Count && i != nodeList.Count)
            {
                if (nodeList.Item(i) != null)
                {
                    var xmlNode = nodeList.Item(i);
                    if (xmlNode != null) innerList.Add(xmlNode.InnerText);
                        string oldName = innerList[i];

                    list.Add(oldName);
                    i++;
                }
            }

        }
    }
    catch
    {
    }   
}


public void GetWorkOrder(string url, List<string> list)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(url);
    string search = Path.GetFileNameWithoutExtension(url);
    XmlNodeList nodeList = doc.GetElementsByTagName("WO_NAME");
    List<string> innerList = new List<string>();

    if (nodeList.Count > 0)
    {
        int i = 0;
        while (i < nodeList.Count)
        {
            if (nodeList.Item(i) != null)
            {
                var xmlNode = nodeList.Item(i);
                if (xmlNode != null) innerList.Add(xmlNode.InnerText);
                    string oldName = innerList[i];
                list.Add(oldName);
                i++;
            }
        }

    } 
}

public void ReplaceText(string url, List<string> list, string text)
{
    string content = File.ReadAllText(url);
    string old;
    string newText;
    int i = 0;
    while (i < list.Count)
    {
        old = list[i];
        newText = old + text;

        content = content.Replace(old, newText);
        File.WriteAllText(url, content);
        i++;
    }
}

这是我正在使用的 XML 文件的一部分:

<?xml version="1.0" encoding="utf-8"?>
<INVENTORY>
    <STRUCTURE>
        <ACCOUNT_CODE>85C</ACCOUNT_CODE>
        <ANCILLARYROLE>0</ANCILLARYROLE>
        <AVERAGE_FLOOR_HEIGHT>0</AVERAGE_FLOOR_HEIGHT>
        <CATEGORY_NAME>CAPPED</CATEGORY_NAME>
        <DEPTH_PLACED>0</DEPTH_PLACED>
        <DIAMETER>0</DIAMETER>
        <ENABLED>1</ENABLED>
        <ENDING_FLOOR>0</ENDING_FLOOR>
        <GEOMETRY>X="612001.739290147" Y="2615034.85310004"</GEOMETRY>
        <GROUND_FLOOR_NUMBER>0</GROUND_FLOOR_NUMBER>
        <GROUND_HEIGHT>0</GROUND_HEIGHT>
        <HEIGHT>0</HEIGHT>
        <INSTALLED_COST>0</INSTALLED_COST>
        <INVENTORY_STATUS_CODE>IPL</INVENTORY_STATUS_CODE>
        <LENGTH>0</LENGTH>
        <LOCATION_CODE>LOC_105441</LOCATION_CODE>
        <MANUFACTURER_CODE>UNSPECIFIED</MANUFACTURER_CODE>
        <MATERIAL_COST>0</MATERIAL_COST>
        <MAX_POWER_REQUIREMENT>0</MAX_POWER_REQUIREMENT>
        <MODEL_UUID>{18E86703-E7D6-4755-9B15-11597BA96EB6}</MODEL_UUID>
        <OWNERSHIP_TYPE_CODE>OWN</OWNERSHIP_TYPE_CODE>
        <PRODUCT_LINE_CODE>UNSPECIFIED</PRODUCT_LINE_CODE>
        <REF_TYPE>NONE</REF_TYPE>
        <REF_UUID>{35454233-F799-44E5-B8FA-A1D2BB134DC2}</REF_UUID>
        <ROTATION>0</ROTATION>
        <STARTING_FLOOR>0</STARTING_FLOOR>
        <STRUCTURE_NAME>CAP:CAP::380465</STRUCTURE_NAME>
        <STRUCTURE_REF_NAME>End Cap</STRUCTURE_REF_NAME>
        <TRANSMEDIA_DEMAND>0</TRANSMEDIA_DEMAND>
        <TYPE_NAME>CAPPED</TYPE_NAME>
        <UNITS>0</UNITS>
        <UUID>{AB826169-F95A-42C6-BD95-0A4CD153F03A}</UUID>
        <VOLUME>0</VOLUME>
        <WEIGHT>0</WEIGHT>
        <WIDTH>0</WIDTH>
        <WO_NAME>exp-test</WO_NAME>
    </STRUCTURE>
</INVENTORY>

标签: c#xmlparsing

解决方案


推荐阅读