.NET, XmlSerializer InvalidOperationException, из-за определения XmlSchema? - PullRequest
1 голос
/ 02 августа 2010

Я загрузил ZIP-файл, содержащий и файл XML, который я пытаюсь прочитать, и соответствующие файлы XSD в http://www.bonnland.de/FIBEX.zip

Я пытаюсь десериализовать следующий XML (фрагмент) с помощью XmlSerializer. При этом я получаю сообщение об ошибке: (извините за то, что это немецкий, я приведу грубый перевод курсив )

System.InvalidOperationException==>Fehler im XML-Dokument (90,7).
System.InvalidOperationException==>Der angegebene Typ wurde nicht erkannt:  Name='CONTROLLER-TYPE', Namespace='http://www.asam.net/xml/fbx/can', bei .

Это переводится как:

System.InvalidOperationException==>error in XML document (90,7).
System.InvalidOperationException==>the given type could not be found: Name='CONTROLLER-TYPE', Namespace='http://www.asam.net/xml/fbx/can', at 

Вот исходный документ:

<fx:ECU ID="ecuSpeedControl">
  <ho:SHORT-NAME>SpeedControl</ho:SHORT-NAME> 
  <ho:DESC>ECU controlling drive speed</ho:DESC> 
  <fx:CONTROLLERS>
  <fx:CONTROLLER xsi:type="can:CONTROLLER-TYPE" ID="ctrlSpeedControl">
  <ho:SHORT-NAME>ctrlSpeedControl</ho:SHORT-NAME> 
  <ho:DESC>CAN controller of ECU</ho:DESC> 
  <fx:CHIP-NAME>SJA1000</fx:CHIP-NAME> 
  <can:TIME-SEG0>11</can:TIME-SEG0> 
  <can:TIME-SEG1>4</can:TIME-SEG1> 
  <can:SYNC-JUMP-WIDTH>2</can:SYNC-JUMP-WIDTH> 
  <can:NUMBER-OF-SAMPLES>1</can:NUMBER-OF-SAMPLES> 
  </fx:CONTROLLER>
  </fx:CONTROLLERS>
  </fx:ECU>

Корневой элемент:

<fx:FIBEX xmlns:fx="http://www.asam.net/xml/fbx" xmlns:ho="http://www.asam.net/xml"     
    xmlns:can="http://www.asam.net/xml/fbx/can" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="fibex4can.xsd" VERSION="3.1.0">

определение класса для этого фрагмента:

public ref class FIBEXECU : AbstractFIBEXNode, IGenericContainable
 {
 public:

  ref class ControllersContainer : FIBEXGenericContainer<FIBEXController^>{
  public:
   [XmlElement("CONTROLLER")]
   property array<FIBEXController^>^ ControllerObjs {
    array<FIBEXController^>^ get() { return Children;}
    void set(array<FIBEXController^>^ value) { Children = value;}
   }
  };

  [XmlAttribute("ID")]
  virtual property String^ ID;

  [XmlElement("SHORT-NAME", Namespace="http://www.asam.net/xml")]
  property String^ ShortName;

  [XmlElement("CONTROLLERS")]
  property ControllersContainer^ Controllers;
};

Я надеюсь, что (еще раз) кто-то может мне помочь, так как я не нашел решения в Google или здесь.

1 Ответ

1 голос
/ 04 августа 2010

Ошибка, которую вы получаете, указывает на то, что определенный тип недоступен.Просматривая ваш XSD, есть довольно много неопределенных типов, но, скорее всего, вы не включили импортированные и включенные файлы XSD, поэтому я не могу надежно проверить достоверность ваших документов.

Сам XML содержит ошибки,Например, xsi:schemaLocation неверен, он должен содержать пары с пространством имен и местоположением.Вместо этого:

xsi:schemaLocation="fibex4can.xsd" 

это должно быть так (при условии, что файл действительно находится в том же каталоге, что и XML):

xsi:schemaLocation="http://www.asam.net/xml/fbx/can fibex4can.xsd" 

Я предполагаю, что очевидные ошибкиВаш документ является причиной того, что он не может быть проанализирован.По сути, при работе с XML вы должны быть очень строгими (как и с любым языком программирования).Если вы указываете процессору проверять документ, то схемы должны быть доступны, они сами должны быть действительными, любые связанные схемы должны быть обнаруживаемыми, и, наконец, документ XML должен быть действительным в отношении этих схем.Соответствующие процессоры (например, с .NET) должны подчиняться этим и другим правилам для XML, а также должны выдавать ошибку и прекращать синтаксический анализ документа, когда XML не правильно сформирован или недействителен.

...