c#操作xml文件
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace XMLTest
{
public class CommXml
{
public XmlDocument xmlDoc = new XmlDocument();
public void getXmlDoc(string strXml)
{
xmlDoc.LoadXml(strXml);
}
public CommXml(string strXml)
{
xmlDoc.LoadXml(strXml);
}
/// <summary>
/// 从父节点开始,中间用逗号隔开
/// </summary>
/// <param name="strNode">节点名称</param>
/// <param name="strValue">节点值</param>
public void setNodeValue(string strNode, string strValue)
{
XmlNode xn = getNode(strNode);
xn.InnerText = strValue;
}
/// <summary>
/// 根据逗号相隔节点名称取得当前节点
/// </summary>
/// <param name="strNode"></param>
/// <returns></returns>
private XmlNode getNode(string strNode)
{
XmlNode xn = null;
string[] strNodeNameArr = strNode.Trim(',').Split(',');
foreach (string strNodeName in strNodeNameArr)
{
if (xn == null)
{
if (strNodeName.IndexOf("*") > 0)
{
xn = getNodeListNode(strNodeName, xmlDoc);
}
else
{
xn = xmlDoc.SelectSingleNode(strNodeName);
}
}
else
{
if (strNodeName.IndexOf("*") > 0)
{
xn = getNodeListNode(strNodeName, xn);
}
else
{
xn = xn.SelectSingleNode(strNodeName);
}
if (xn == null) throw new Exception("节点" + strNodeName + "不存在.");
}
}
return xn;
}
/// <summary>
/// 节点列表中单个节点取得
/// </summary>
/// <param name="strNode">节点列表节点名称:例;nodename*0 指节点名称是nodename的节点数组下标是0的节点取得</param>
/// <param name="fatherXn">当前节点的父亲节点</param>
/// <returns></returns>
private XmlNode getNodeListNode(string strNode, XmlNode fatherXn)
{
XmlNode xn = null;
string[] strNodeListNameAndArrNum = strNode.Split('*');
XmlNodeList xnList = fatherXn.SelectNodes(strNodeListNameAndArrNum[0]);
xn = xnList.Item(Convert.ToInt32(strNodeListNameAndArrNum[1]));
return xn;
}
/// <summary>
/// 节点属性值设定
/// </summary>
/// <param name="strNode">从父节点开始,中间用逗号隔开</param>
/// <param name="strAttributeName">节点名称</param>
/// <param name="strValue">节点值</param>
public void setNodeAttributes(string strNode, string strAttributeName, string strValue)
{
XmlNode xn = getNode(strNode);
try
{
xn.Attributes[strAttributeName].Value = strValue;
}
catch
{
throw new Exception("节点" + strNode + "不存在属性[" + strAttributeName + "].");
}
}
/// <summary>
/// 节点属性值取得
/// </summary>
/// <param name="strNode">从父节点开始,中间用逗号隔开</param>
/// <param name="strAttributeName">节点名称</param>
/// <returns></returns>
public string getNodeAributeValue(string strNode, string strAttributeName)
{
try
{
XmlNode xn = getNode(strNode);
return xn.Attributes[strAttributeName].Value;
}
catch
{
throw new Exception("节点" + strNode + "不存在属性[" + strAttributeName + "].");
}
}
/// <summary>
/// 数组也表数据节点属性值设定
/// </summary>
/// <param name="strNode">从父节点开始,中间用逗号隔开</param>
/// <param name="strAttributeName">节点名称</param>
/// <param name="strValue">节点值</param>
/// <param name="arrNum">数组节点下标,从0开始</param>
public void setNodeListAttributes(string strNode, string strAttributeName, string strValue, int arrNum)
{
}
public void test()
{
string strXml = @" <battleArmies>
<battleArmy side=""1"">
<battleTroops>
<battleTroop position=""0"">
<battleTeams>
<battleTeam id=""1000"" x=""15"" y=""7"" hp=""80.0"" amount=""8"">
<soldierConfig name=""老虎"" type=""LAO_HU"" category=""2"" attack=""18.0"" defence=""15.0"" hp=""10.0"" moveSpeed=""10.0"" attackScope=""1.0"" attackSpeed=""15.0"" destroy=""null"" critical=""null"" criticalRate=""null"">
<attackAddon key_0=""2.83"" key_1=""1.0"" key_2=""1.0"" key_3=""1.0"" key_4=""1.0"" />
</soldierConfig>
<soldierAddonConfig name=""老虎"" type=""LAO_HU"" category=""2"" attack=""18.18"" defence=""15.15"" hp=""10.0"" moveSpeed=""10.0"" attackScope=""1.0"" attackSpeed=""15.0"" destroy=""null"" critical=""null"" criticalRate=""null"">
<attackAddon key_0=""2.83"" key_1=""1.0"" key_2=""1.0"" key_3=""1.0"" key_4=""1.0"" />
</soldierAddonConfig>
</battleTeam>
</battleTeams>
</battleTroop>
</battleTroops>
</battleArmy>
</battleArmies>
";
CommXml xml = new CommXml(strXml);
xml.setNodeAttributes("battleArmies,battleArmy,battleTroops,battleTroop,battleTeams,battleTeam*0,soldierConfig*0,attackAddon", "key_0", "2999");
string strNodeValue = xml.getNodeAributeValue("battleArmies,battleArmy,battleTroops,battleTroop,battleTeams,battleTeam*0,soldierConfig*0,attackAddon", "key_0");
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从零实现富文本编辑器#3-基于Delta的线性数据结构模型
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
· Android编译时动态插入代码原理与实践
· 使用TypeScript开发微信小程序(云开发)-入门篇
· 没几个人需要了解的JDK知识,我却花了3天时间研究
· 定时任务稳定性解决方案-healthchecks监控系统
· 在SqlSugar的开发框架中增加对低代码EAV模型(实体-属性-值)的WebAPI实现支持
· .NET Core中的配置Configuration实战