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");
}
}
}