Unity C#读取XML文件触发XmlException意外字符错误如何解决
错误原因
- 核心触发报错的原因是你的XML文件使用了中文全角弯引号(”),不符合XML语法规范要求的英文半角引号(")。报错指向的第1行第15位就是XML声明
<?xml version=”1.0″里version属性值的第一个全角引号,该字符不属于XML允许的属性值包裹符号,因此直接触发解析异常。 - 除此之外你的代码和XML结构还存在多处不匹配问题,后续也会触发运行错误:
- XPath查询路径与XML结构不匹配:C#代码中写的查询路径是
/Dialogue/chapter_1,但你的XML根节点直接是chapter_1,没有外层的Dialogue节点,查询会返回空值。 - 查询条件属性名不匹配:XPath中写的筛选条件是
@page='dlg_xxx',但你的XML中page节点的唯一属性是ID,不存在page属性。 - 字段取值方式错误:你将
name、dialogue当做page节点的属性读取,但这两个字段在XML中是page的子节点,不是属性。 DataLoader类中的reader字段没有初始化,调用UpdateTextData方法时会触发空引用异常。- 颜色赋值逻辑错误:代码中连续两次给
b变量赋值,丢失了绿色通道的正确值。 - 空判断逻辑错误:代码中判断的是
DialogueData是否为空,实际应该判断查询到的data节点是否为空。
- XPath查询路径与XML结构不匹配:C#代码中写的查询路径是
解决方案
- 替换XML中所有的中文全角引号为英文半角引号,修改后的XML示例如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Dialogue> <chapter_1> <page ID = "dlg_1"> <portrait>SexyMan</portrait> <name>???</name> <dialogue>This is a test.</dialogue> <color> <r>0</r> <g>0</g> <b>0</b> <a>255</a> </color> <end>false</end> <continue>2</continue> </page> </chapter_1> </Dialogue>
(注:这里额外加了外层<Dialogue>根节点,匹配你原来的XPath路径,你也可以选择删除XPath中的/Dialogue前缀)
2. 修改LoadDialogue方法中的XPath查询和空判断逻辑:
public void LoadDialogue(int dialogueID) { XmlNode data = DialogueData.SelectSingleNode("/Dialogue/chapter_1/page[@ID='dlg_" + dialogueID.ToString() + "']"); if (data == null) { Debug.LogError("Couldn't locate dlg_" + dialogueID.ToString() + " in the list."); return; } DataLoader items = new DataLoader(data, this); items.UpdateTextData(); }
- 修改
DataLoader类的构造函数,初始化reader字段,修正取值逻辑和颜色赋值逻辑:
class DataLoader { XMLReader reader; // 其他字段保持不变 // 修改构造函数,新增XMLReader参数 public DataLoader(XmlNode curDialogue, XMLReader parentReader) { // 初始化reader字段 reader = parentReader; id = curDialogue.Attributes["ID"].Value; // 改为从子节点读取name和dialogue name = curDialogue["name"].InnerText; dialogue = curDialogue["dialogue"].InnerText; endDialogue = bool.Parse(curDialogue["end"].InnerText); continueDialogue = int.Parse(curDialogue["continue"].InnerText); string pathToImage = "Portraits/" + curDialogue["portrait"].InnerText; curPortrait = Resources.Load<Sprite>(pathToImage); XmlNode colorNode = curDialogue.SelectSingleNode("color"); float r = float.Parse(colorNode["r"].InnerText); float g = float.Parse(colorNode["g"].InnerText); float b = float.Parse(colorNode["b"].InnerText); float a = float.Parse(colorNode["a"].InnerText); // 修正颜色赋值错误 r = NormalizeColorValue(r); g = NormalizeColorValue(g); b = NormalizeColorValue(b); a = NormalizeColorValue(a); textColor = new Color(r, g, b, a); } // 其他方法保持不变 }
内容的提问来源于stack exchange,提问作者A Fish
相关产品推荐
相关产品推荐

