c# - 通过 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# - 实体框架核心关系——外键
- node.js - 我的 vue.config 文件中的代理有什么意义?
- java - 将 imageIcon 导出为缓冲图像
- c++ - 使用一组学生及其各自的 GPA 对 GPA 进行各种计算
- r - 循环遍历变量列表 - 嵌入式循环
- python - 如何在 Python BaseHTTPRequestHandler 中处理分块编码?
- python - 为什么系统杀死了我的 python 程序?但是我在 var/log 目录中没有找到任何日志
- routing - 无法匹配 clojurescript bidi 中的任意路由
- java - 在互联网连接等待循环之前显示吐司
- javascript - 应用程序可在 Android 和 IOS 模拟器中运行,但在发布后无法运行