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

XML反序列化命名空间适配异常:动态指定无效问题求助

反序列化XML时的命名空间问题

问题背景

我尝试反序列化XML文件并提取其中StructuredText元素的数据,但命名空间一直引发问题。通过xsd工具从Schema生成了类,但这些类未指定命名空间;由于需要适配不同命名空间,希望能灵活设置。

尝试的方法及遇到的问题

我曾尝试在XmlRootAttribute中定义命名空间,但反序列化仅返回null;若不指定命名空间,反序列化器会在StructuredText元素上报错。相关代码如下:

private StructuredText_T DeserializeStructuredText(string filePath) {
    StructuredText_T structuredText;

    XmlSerializer serializer = new XmlSerializer(typeof(TIAOpennessAppSclXsd.StructuredText_T),
    new XmlRootAttribute("StructuredText")
    {
        Namespace = "http://www.siemens.com/automation/Openness/SW/NetworkSource/StructuredText/v4",
        IsNullable = false
    });

    XmlReaderSettings settings = new XmlReaderSettings
    {
        CheckCharacters = false // Ignore invalid characters
    };

    using (XmlReader reader = XmlReader.Create(filePath, settings))
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element && reader.Name == "StructuredText")
            {
                Console.WriteLine($"Deserialize {reader.NodeType} named {reader.Name}");
                structuredText = (StructuredText_T)serializer.Deserialize(reader);
                return (structuredText);
            }
        }

    return null;
}

仅生效但不符合需求的方式

只有修改XSD生成类的XmlRootAttribute并指定命名空间时,反序列化才生效,代码如下:

[System.Xml.Serialization.XmlRootAttribute("StructuredText", Namespace="http://www.siemens.com/automation/Openness/SW/NetworkSource/StructuredText/v4", IsNullable=false)]

但我希望避免这种方式,一是因为类数量众多,二是需要灵活性。生成类的完整代码如下:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlRootAttribute("StructuredText", Namespace="", IsNullable=false)]
public partial class StructuredText_T {
    private object[] itemsField;
    private int uIdField;
    private bool uIdFieldSpecified;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Access", typeof(Access_T))]
    [System.Xml.Serialization.XmlElementAttribute("Blank", typeof(Blank_T))]
    [System.Xml.Serialization.XmlElementAttribute("Comment", typeof(Comment_T))]
    [System.Xml.Serialization.XmlElementAttribute("LineComment", typeof(LineComment_T))]
    [System.Xml.Serialization.XmlElementAttribute("NewLine", typeof(NewLine_T))]
    [System.Xml.Serialization.XmlElementAttribute("Parameter", typeof(Parameter_T))]
    [System.Xml.Serialization.XmlElementAttribute("Text", typeof(Text_T))]
    [System.Xml.Serialization.XmlElementAttribute("Token", typeof(Token_T))]
    public object[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int UId {
        get {
            return this.uIdField;
        }
        set {
            this.uIdField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool UIdSpecified {
        get {
            return this.uIdFieldSpecified;
        }
        set {
            this.uIdFieldSpecified = value;
        }
    }
}

请问我遗漏了什么?


内容的提问来源于stack exchange,提问作者JohnnyHavlis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:34:52