2010-05-04 6 views
2
를 사용하여 생성

내가 가진 내가 잘 직렬화 수 있지만 시도하고 직렬화 때, 나는 오류 내려면 .XSD에서 (xsd.exe를 사용하여) 생성 된 클래스 :역 직렬화 클래스는 XSD.exe

{"<XMLLanguages xmlns='http://tempuri.org/XMLLanguages.xsd'> was not expected."} 

몇 시간 동안 검색 한 결과 xsd/xml에서 네임 스페이스를 선언하지 않고 자신의 클래스에 네임 스페이스를 정의하지 않는 등 대부분의 사람들의 문제가 발견되었지만 문제에 대한 해결책을 찾을 수 없습니다.

다음은 관련 클래스에 대한 코드 스 니펫입니다.

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="XMLLanguages" 
    targetNamespace="http://tempuri.org/XMLLanguages.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/XMLLanguages.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
    <xs:element name="XMLLanguages"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Tier" minOccurs="1" maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="L" minOccurs="1" maxOccurs="unbounded" type="Language"/> 
      </xs:sequence> 
      <xs:attribute name="TierID" type="xs:int"/> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="Language"> 
    <xs:sequence> 
     <xs:element name="LangID" type="xs:int"/> 
     <xs:element name="Tier" type="xs:int"/> 
     <xs:element name ="Name" type="xs:string"/> 
    </xs:sequence> 
    <xs:attribute name ="PassRate" type="xs:int"/> 
    </xs:complexType> 
</xs:schema> 

그리고 클래스 : 오류의 원인 XML에

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://tempuri.org/XMLLanguages.xsd")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://tempuri.org/XMLLanguages.xsd", IsNullable = false)] 
public partial class XMLLanguages 
{ 
    private List<XMLLanguagesTier> tierField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("Tier")] 
    public List<XMLLanguagesTier> Tiers { 
     get { 
      return this.tierField; 
     } 
     set { 
      this.tierField = value; 
     } 
    } 
} 

그리고 라인 :

<XMLLanguages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/XMLLanguages.xsd"> 

직렬화 복원 방법 : 나는 다음과 같은 코드를 사용

public static object Deserialize(XmlDocument xml, Type type) 
    { 
     XmlSerializer s = new XmlSerializer(type); 
     string xmlString = xml.OuterXml.ToString(); 
     byte[] buffer = ASCIIEncoding.UTF8.GetBytes(xmlString); 
     MemoryStream ms = new MemoryStream(buffer); 
     XmlReader reader = new XmlTextReader(ms); 
     Exception caught = null; 

     try 
     { 
      object o = s.Deserialize(reader); 
      return o; 
     } 

     catch (Exception e) 
     { 
      caught = e; 
     } 
     finally 
     { 
      reader.Close(); 

      if (caught != null) 
       throw caught; 
     } 
     return null; 
    } 
+0

코드 조각이 실제로 역 직렬화를 수행하는지 보여줄 수 있습니까? deserialization 코드에서 XML 네임 스페이스 "http://tempuri.org/XMLLanguages.xsd"에주의를 기울이고 관심을 기울이고 있습니까? –

+0

에서 편집 됨. – heap

답변

0

그리고 그것은 잘 작동합니다.

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="Report" 
      targetNamespace="http://www.xyz.com/Report.xsd" 
      elementFormDefault="qualified" 
      xmlns="http://www.xyz.com/Report.xsd" 
      xmlns:mstns="http://www.xyz.com/Report.xsd" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="Report"> 
    <xs:complexType> 
    ... 

xsd.exe에/n : xyz 네임 스페이스 옵션을 사용합니다.

이것은 잘 작동하는 것 같습니다. 따라서 tempuri.org 도메인 이름과 관련된 문제가 있다고 가정합니다.

희망이 있습니다.

리처드.

+0

tempuri 도메인은 VS2010의 xsd 파일에 대한 기본 도메인입니다. 새로운 xml 파일로 다른 도메인을 시도했지만 오류가 동일합니다. 새 도메인을 저장하십시오. – heap

+0

나는이 문제가 클래스가 xml과 동일한 네임 스페이스에있는 것으로 정의되지 않았을 수 있으므로 모든 네임 스페이스가 동일하게 변경 될 수 있다고 생각했습니다. 아직도 작동하지 않습니다. 그러나 XmlDocument의 NamespaceURI 속성은 ""입니다. 이것이 문제인지 확실하지 않습니다. – heap

0

당신은 루트에서의 targetNamespace 속성을 제거하고 XMLLanguages ​​노드 전에 다음 노드를 추가해야합니다

<xs:import namespace="http://www.w3.org/2001/XMLSchema"/> 

위는 직렬화 드릴 것입니다,하지만 난 수평선에 다른 문제를 감지. 당신이 직면 한 문제는 여러 복잡한 유형을 정의 할 때 targetNamespace 특성을 사용할 수 없다는 것입니다. 스키마 네임 스페이스에 오신 것을 환영합니다. ...