You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity C#读取XML文件触发XmlException意外字符错误如何解决

错误原因
  • 核心触发报错的原因是你的XML文件使用了中文全角弯引号(”),不符合XML语法规范要求的英文半角引号(")。报错指向的第1行第15位就是XML声明<?xml version=”1.0″里version属性值的第一个全角引号,该字符不属于XML允许的属性值包裹符号,因此直接触发解析异常。
  • 除此之外你的代码和XML结构还存在多处不匹配问题,后续也会触发运行错误:
    1. XPath查询路径与XML结构不匹配:C#代码中写的查询路径是/Dialogue/chapter_1,但你的XML根节点直接是chapter_1,没有外层的Dialogue节点,查询会返回空值。
    2. 查询条件属性名不匹配:XPath中写的筛选条件是@page='dlg_xxx',但你的XML中page节点的唯一属性是ID,不存在page属性。
    3. 字段取值方式错误:你将name、dialogue当做page节点的属性读取,但这两个字段在XML中是page的子节点,不是属性。
    4. DataLoader类中的reader字段没有初始化,调用UpdateTextData方法时会触发空引用异常。
    5. 颜色赋值逻辑错误:代码中连续两次给b变量赋值,丢失了绿色通道的正确值。
    6. 空判断逻辑错误:代码中判断的是DialogueData是否为空,实际应该判断查询到的data节点是否为空。
解决方案
  1. 替换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();
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:06:00