Ошибка десериализации в документе XML (2,2) - PullRequest
1 голос
/ 25 марта 2020

Я пытаюсь десериализовать документ 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;
        }

1 Ответ

0 голосов
/ 30 марта 2020

Похоже, что проблема заключалась в параметре 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;
        }
...