2012-02-10 4 views
0

XSDがあり、XSDから要素を受け取るWCF RESTエンドポイントを定義したいとします。XSDから生成されたコードがWCF RESTエンドポイントの有効なXMLを受け入れない

私は

は私が生成するXsd.exeではを使用する場合はここでは、次のスキーマ

<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="dir"> 
     <xs:complexType> 
      <xs:sequence maxOccurs="unbounded" minOccurs="0"> 
        <xs:element ref="dir" /> 
        <xs:element name="file"> 
         <xs:complexType> 
          <xs:attribute name="id" type="xs:integer" /> 
          <xs:attribute name="name" type="xs:string" /> 
         </xs:complexType> 
        </xs:element> 
      </xs:sequence> 
      <xs:attribute name="name" type="xs:string" /> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

は、そのスキーマ

<dir name="root"> 
    <dir name="foo"> 
    <file id="12" name="ha" /> 
    <file id="12" name="ha" /> 
    </dir> 
    <dir name="bar" /> 
    <file id="12" name="ha" /> 
    <file id="12" name="ha" /> 
</dir 

のためのいくつかの有効なXMLで考えてみてやっているものを説明しますスキーマのクラス私は上記のXMLを作成することができます。

dir foo = new dir{dir1 = new dir[2], name = "root", file = new dirFile[2]}; 
foo.file[0] = new dirFile{id = "12", name = "ha"}; 
foo.file[1] = new dirFile { id = "12", name = "ha" }; 
var file = new dirFile[2]; 
file[0] = new dirFile { id = "12", name = "ha" }; 
file[1] = new dirFile { id = "12", name = "ha" }; 
foo.dir1[0] = new dir { name = "foo", file = file}; 
foo.dir1[1] = new dir {name = "bar"}; 

XmlSerializer ser = new XmlSerializer(typeof(dir)); 
ser.Serialize(Console.Out, foo) 

は今、私はそれがより大幅に異なっているXSD、有効なXMLを示し、そのサービスのヘルプページを見ればWCF REST XMLエンドポイント

[WebInvoke(UriTemplate = "doit"] 
public void doit(dir data) { /* process it */ } 

に入力としてそれを使用したいと言うことができます私がXSDで手動で定義したもの。私はそのサービスに、私が以前に生成されたXMLを投稿しようとすると、私は次のエラーを取得する

The exception message is 'Unable to deserialize XML body with root name 'dir' and root namespace '' 

どのように私は私がXSDで定義されたXMLを受信するWebサービスを定義していますか?

EDIT:RESTヘルプページで生成されたXSDとXMLを示します。

<xs:schema xmlns:tns="http://schemas.datacontract.org/2004/07/Thomson.Quiz.Web.Services.Models" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/Thomson.Quiz.Web.Services.Models" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="dir"> 
    <xs:sequence> 
     <xs:element name="dir1Field" nillable="true" type="tns:ArrayOfdir" /> 
     <xs:element name="fileField" nillable="true" type="tns:ArrayOfdirFile" /> 
     <xs:element name="nameField" nillable="true" type="xs:string" /> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:element name="dir" nillable="true" type="tns:dir" /> 
    <xs:complexType name="ArrayOfdir"> 
    <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="unbounded" name="dir" nillable="true" type="tns:dir" /> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:element name="ArrayOfdir" nillable="true" type="tns:ArrayOfdir" /> 
    <xs:complexType name="ArrayOfdirFile"> 
    <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="unbounded" name="dirFile" nillable="true" type="tns:dirFile" /> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:element name="ArrayOfdirFile" nillable="true" type="tns:ArrayOfdirFile" /> 
    <xs:complexType name="dirFile"> 
    <xs:sequence> 
     <xs:element name="idField" nillable="true" type="xs:string" /> 
     <xs:element name="nameField" nillable="true" type="xs:string" /> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:element name="dirFile" nillable="true" type="tns:dirFile" /> 
</xs:schema> 

そして、ここでの例のXML

<dir xmlns="http://schemas.datacontract.org/2004/07/Thomson.Quiz.Web.Services.Models"> 
    <dir1Field> 
    <dir> 
     <dir1Field> 
     <dir> 
      <dir1Field i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" /> 
      <fileField> 
      <dirFile> 
       <idField>String content</idField> 
       <nameField>String content</nameField> 
      </dirFile> 
      <dirFile> 
       <idField>String content</idField> 
       <nameField>String content</nameField> 
      </dirFile> 
      </fileField> 
      <nameField>String content</nameField> 
     </dir> 
     <dir> 
      <dir1Field i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" /> 
      <fileField> 
      <dirFile> 
       <idField>String content</idField> 
       <nameField>String content</nameField> 
      </dirFile> 
      <dirFile> 
       <idField>String content</idField> 
       <nameField>String content</nameField> 
      </dirFile> 
      </fileField> 
      <nameField>String content</nameField> 
     </dir> 
     </dir1Field> 
     <fileField> 
     <dirFile> 
      <idField>String content</idField> 
      <nameField>String content</nameField> 
     </dirFile> 
     <dirFile> 
      <idField>String content</idField> 
      <nameField>String content</nameField> 
     </dirFile> 
     </fileField> 
     <nameField>String content</nameField> 
    </dir> 
    <dir> 
     <dir1Field> 
     <dir> 
      <dir1Field i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" /> 
      <fileField> 
      <dirFile> 
       <idField>String content</idField> 
       <nameField>String content</nameField> 
      </dirFile> 
      <dirFile> 
       <idField>String content</idField> 
       <nameField>String content</nameField> 
      </dirFile> 
      </fileField> 
      <nameField>String content</nameField> 
     </dir> 
     <dir> 
      <dir1Field i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" /> 
      <fileField> 
      <dirFile> 
       <idField>String content</idField> 
       <nameField>String content</nameField> 
      </dirFile> 
      <dirFile> 
       <idField>String content</idField> 
       <nameField>String content</nameField> 
      </dirFile> 
      </fileField> 
      <nameField>String content</nameField> 
     </dir> 
     </dir1Field> 
     <fileField> 
     <dirFile> 
      <idField>String content</idField> 
      <nameField>String content</nameField> 
     </dirFile> 
     <dirFile> 
      <idField>String content</idField> 
      <nameField>String content</nameField> 
     </dirFile> 
     </fileField> 
     <nameField>String content</nameField> 
    </dir> 
    </dir1Field> 
    <fileField> 
    <dirFile> 
     <idField>String content</idField> 
     <nameField>String content</nameField> 
    </dirFile> 
    <dirFile> 
     <idField>String content</idField> 
     <nameField>String content</nameField> 
    </dirFile> 
    </fileField> 
    <nameField>String content</nameField> 
</dir 
+0

結果の間違ったXMLを表示してください。 –

+0

残りのヘルプページから間違って生成されたxml/xsdで更新されました –

答えて

0

である私は、あなたが使用しているデザインパターンを変更することをお勧めします。読みやすさを向上させるために、命名規則を改善することを検討することをお勧めします。私はまた、あなたのXML文書にある

<dir1Field> 
    <dir> 
     <dir1Field> 
     <dir> 

を削除します。

<Directory> 
    <Files> 
    <File> 
    <name /> 
    <id /> 
    </File> 
</Files> 
</Directory> 

強く型付けされたオブジェクトを使用して、以下で説明するように適切な属性でオブジェクトを修飾してみてください。スクリプト内のローカルオブジェクトのインスタンス化に続いて、 上記のようにvarキーワードを使用して、通常のオブジェクトプロパティと同じようにフィールドに値を設定できます。あなたのケースでは、あなたが(名前、IDなど)を必要とするすべての必要なファイル情報を保持するためにバッキングオブジェクトを作成することを検討する必要があります

/// <remarks/> 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
    [System.Xml.Serialization.XmlRootAttribute(ElementName="Directory")] 
    public partial class 
    { 

     [System.Xml.Serialization.XmlArrayItemAttribute("File", IsNullable = false)] 
     [XmlArray(ElementName="Files")] 
     public File[] FileFieldCollection{ get; set; } 

    } 

必要に応じて、あなたのFileFieldにオブジェクトを移入して、あなたは問題ないはずです。

+0

最初のスキーマ/ xmlが必要です。私はそのXMLを取得しない、またはデフォルトのシリアライザを使用しない回避策を知っています。それは問題ではありません。私は元のスキーマが必要です。 2番目のスキーマとxmlは、元のスキーマでXSD.exeを使用するときにWCFで使用されるものです。あなたが指摘したように、彼らは冗長なXMLを生成し、それは喜ばしくない。私はマーシャリング/アンマーシャリングのための属性を持つ標準POCOを使用している間に私の元のスキーマを使用するソリューションが必要です。 –

関連する問題