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
相关产品推荐
相关产品推荐

