.NET,XmlSerializer InvalidOperationException,由于XmlSchema定义?

时间:2010-08-02 09:48:08

标签: c++-cli xmlserializer invalidoperationexception

我上传了一个ZIP文件,其中包含我正在尝试阅读的XML文件和相应的XSD文件http://www.bonnland.de/FIBEX.zip

我正在尝试使用XmlSerializer反序列化以下XML(片段)。这样做的时候我得到了错误:(抱歉它是德语我会在斜体中给出一个粗略的翻译)

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;
};

我希望(再次)有人可以帮助我,因为我没有在谷歌或这里找到解决方案。

1 个答案:

答案 0 :(得分:1)

您得到的错误似乎表明某种类型不可用。通过XSD查看,有一些类型未定义,但这可能是因为您没有包含导入和包含的XSD文件,因此我无法可靠地检查文档的有效性。

XML本身包含错误。例如,xsi:schemaLocation不正确,它必须包含名称空间和位置的对。而不是:

xsi:schemaLocation="fibex4can.xsd" 

它应该是这样(假设文件确实与XML在同一目录中):

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

我的猜测是,文档的明显错误是无法解析的原因。基本上,在处理XML时,您必须非常严格(与任何编程语言一样)。如果您告诉处理器验证文档,那么Schema必须可用,它们本身必须是有效的,任何相关的模式必须是可定位的,最后,XML文档必须对这些模式有效。合规处理器(如使用.NET的处理器)必须遵守XML的这些规则和其他规则,并且当XML格式不正确或无效时,它们必须抛出错误并停止解析文档。