Я пытаюсь десериализовать документ xml, который проверяется с помощью xmlvalidate. Я сократил файл до минимума, но получаю вышеуказанную ошибку.
string tteFilepath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); tteFilepath += "\\" + "SkeletonNetwork.xml"; XmlSerializer serializer = new XmlSerializer(typeof(NetworkDescriptionDTO)); NetworkDescription networkDescription = new NetworkDescription(); NetworkDescriptionDTO ndDTO = new NetworkDescriptionDTO(); try { FileStream fs = new FileStream(tteFilepath, FileMode.Open); ndDTO = (NetworkDescriptionDTO)serializer.Deserialize(fs); fs.Close(); } catch (Exception parseEx) { String exception = parseEx.Message; }
Голый XML выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <nd:NetworkDescription xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:buf="http://www.tttech.com/Schema/TTEthernet/Network_Description/Buffering/5.4.0" xmlns:c="http://www.tttech.com/Schema/TTEthernet/Network_Description/Constraint/5.4.0" xmlns:flows="http://www.tttech.com/Schema/TTEthernet/Network_Description/Flows/5.4.0" xmlns:logical="http://www.tttech.com/Schema/TTEthernet/Network_Description/Logical/5.4.0" xmlns:nd="http://www.tttech.com/Schema/TTEthernet/Network_Description/5.4.0" xmlns:sync="http://www.tttech.com/Schema/TTEthernet/Network_Description/Synchronization/5.4.0" xmlns:t="http://www.tttech.com/Schema/TTEthernet/Network_Description/Triggers/5.4.0" xmlns:topo="http://www.tttech.com/Schema/TTEthernet/Network_Description/Topology/5.4.0" name="tte_demo" enableDynamicRouting="true" createUnknownDefaultRoutes="true" ctMarker="//@flowMarker[name='ctMarker']"> </nd:NetworkDescription>
Я пытался оставив версию в конце путей ns, среди других настроек и скриптов с файлом xml, без особого эффекта.
Ошибка:
"Ошибка в XML документе (2, 2). "
InnerException:
"http://www.tttech.com/Schema/TTEthernet/Network_Description/5.4.0 '> не ожидалось."
Класс для NetworkDescriptionDTO был создан с помощью инструмента xsd.exe с использованием соответствующих файлов xsd.
У кого-нибудь есть идеи?
Ниже приведен фрагмент класса.
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.tttech.com/Schema/TTEthernet/Network_Description/5.4.0")] [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.tttech.com/Schema/TTEthernet/Network_Description/5.4.0", IsNullable = false)] public partial class NetworkDescriptionDTO : NamedElementDTO { private object[] items2Field; private bool enableDynamicRoutingField; private bool createUnknownDefaultRoutesField; private string ctMarkerField; public NetworkDescriptionDTO() { this.enableDynamicRoutingField = false; this.createUnknownDefaultRoutesField = false; }
Похоже, что проблема заключалась в параметре ElementName атрибута XMLRootAttribute. Моя теория состоит в том, что имя класса и имя узла xml, отличающиеся, вызвали проблему. Добавление ElementName в XMLRootAttribute позволило завершить сериализацию без исключения.
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")] [System.SerializableAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.tttech.com/Schema/TTEthernet/Network_Description/5.4.0")] [System.Xml.Serialization.XmlRootAttribute(ElementName = "NetworkDescription", Namespace = "http://www.tttech.com/Schema/TTEthernet/Network_Description/5.4.0", IsNullable = false)] public partial class NetworkDescriptionDTO : NamedElementDTO { private object[] items2Field; private bool enableDynamicRoutingField; private bool createUnknownDefaultRoutesField; private string ctMarkerField; public NetworkDescriptionDTO() { this.enableDynamicRoutingField = false; this.createUnknownDefaultRoutesField = false; }