我有这个xml(为了示例目的而修剪它)
<?xml version="1.0" encoding="utf-8"?>
<levels>
<level><!-- level 1 ! -->
<name>Level 1</name>
<title>Title 01</title>
<crystal01>false</crystal01>
<crystal02>false</crystal03>
<crystal02label>Label 1</crystal03label>
<crystal03>false</crystal04>
</level>
<level><!-- level 2 ! -->
<name>Level 2</name>
<title>Title 02</title>
<crystal01>true</crystal01>
<crystal02>true</crystal03>
<crystal02label>Label 2</crystal03label>
<crystal03>false</crystal04>
</level>
</levels>
我使用此脚本将数据加载到某些变量
public class LoadXmlData : MonoBehaviour // the Class
{
public int actualLevel = 1;
static int LevelMaxNumber;
static int WaipointCounter = 0;
public static string lvlname = "";
public static string lvltitle = "";
public static string crystal01 = "";
public static string crystal02 = "";
public static string crystal02label = "";
public static string crystal03 = "";
public TextAsset XMLData;
List<Dictionary<string,string>> levels = new List<Dictionary<string,string>>();
Dictionary<string,string> obj;
void Start()
{ GetLevel();
StartCoroutine(LevelLoadInfo(0.0F));
LevelMaxNumber = levels.Count;
}
public void GetLevel()
{
XmlDocument xmlDoc = new XmlDocument(); // xmlDoc is the new xml document.
xmlDoc.LoadXml(XMLData.text); // load the file.
XmlNodeList levelsList = xmlDoc.GetElementsByTagName("level"); // array of the level nodes.
foreach (XmlNode levelInfo in levelsList)
{
XmlNodeList levelcontent = levelInfo.ChildNodes;
obj = new Dictionary<string,string>();
foreach (XmlNode levelsItens in levelcontent) // levels itens nodes.
{
if(levelsItens.Name == "name")
{
obj.Add("name",levelsItens.InnerText); // put this in the dictionary.
}
if(levelsItens.Name == "title")
{
obj.Add("title",levelsItens.InnerText); // put this in the dictionary.
}
if(levelsItens.Name == "crystal01")
{
obj.Add("crystal01",levelsItens.InnerText); // put this in the dictionary.
}
if(levelsItens.Name == "crystal02")
{
obj.Add("crystal02",levelsItens.InnerText); // put this in the dictionary.
}
if(levelsItens.Name == "crystal02label")
{
obj.Add("crystal02label",levelsItens.InnerText); // put this in the dictionary.
}
if(levelsItens.Name == "crystal03")
{
obj.Add("crystal03",levelsItens.InnerText); // put this in the dictionary.
}
}
levels.Add(obj); // add whole obj dictionary in the levels[].
}
}
IEnumerator LevelLoadInfo(float Wait)
{
levels[actualLevel-1].TryGetValue("name",out lvlname);
levels[actualLevel-1].TryGetValue("title",out lvltitle);
levels[actualLevel-1].TryGetValue("crystal01",out crystal01);
levels[actualLevel-1].TryGetValue("crystal02",out crystal02);
levels[actualLevel-1].TryGetValue("crystal02label",out crystal02label);
levels[actualLevel-1].TryGetValue("crystal03",out crystal03);
yield return new WaitForSeconds(Wait);
}
void Update()
{
}
}
一切都运行正常,但是我真的很挣几天来创建一个函数来访问某个节点,过度编写它的数据并保存xml,我知道这有点简单,但我不明白(我是一个3d)艺术家,自去年以来我编程,所以,仍处于学习阶段),例如,我如何编辑2级中的“crystal02”值并保存xml? 提前谢谢!
答案 0 :(得分:0)
您必须稍微修改一下XML,以便解析。打开节点名称需要匹配关闭节点名称,因此可以:
<crystal02>false</crystal03>
到此:
<crystal02>false</crystal02>
要回答有关更新单个元素的问题,因为您正在使用XmlDocument来读取字符串,以下是如何通过XPath查找单个元素,在XmlDocument中更新其值,然后序列化将XmlDocument返回给字符串。您的Update方法可能如下所示:
var doc = new System.Xml.XmlDocument();
// strXml is the string containing your XML from XMLData.Text
doc.LoadXml(strXml);
// Find the node by an XPath expression
var l2cr3 = (XmlElement) doc.SelectSingleNode("levels/level[name='Level 2']/crystal03");
// Update it
l2cr3.InnerText = "true";
// Update the string in memory
var sbOut = new System.Text.StringBuilder ();
using (var writer = XmlWriter.Create(sbOut)) {
doc.Save (writer);
}
strXml = sbOut.ToString ();
这将更新内存中的XML字符串。它不会持久存储到文件中。如果要保留文件,可能需要使用doc.Load(&#34; path / to / file.xml&#34;)和doc.Save(&#34; path / to / file.xml&# 34);
我注意到你的字符串实际上来自TextAsset(假设是Unity),如果是这样的话,我不确定你想如何将更新后的XML字符串保存回文件甚至如果你想这样做如果你这样做,这是一个不同的问题,但Unity manual说明了这一点:
它不适用于在运行时生成文本文件。为此你 将需要使用传统的输入/输出编程技术 读写外部文件。