2012-02-07 11 views
5

データベースからレコードを返す単純なWCF WebサービスをC#で作成しました。XML出力が間違っている

WCFは、次の方法を使用します。getQuestionnaireForID?id=(questionnaireID)。 Webserviceはデータベースからすべての正しいレコードを返しますが、間違った順序で表示されます。代わりに、それは現在、以下の順序で戻り

<QuestionnaireXML xmlns="http://schemas.datacontract.org/2004/07/QuestionnaireDescriptor" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <QuestionnaireName>Sample Questionnaire</QuestionnaireName> 
     <Questions> 
      <Question> 
       <QuestionID>297</QuestionID> 
       <QuestionName>What is your favorite type of tree?</QuestionName> 
       <Answers> 
        <Answer> 
         <AnswerTitle>Beech</AnswerTitle> 
        </Answer> 
        <Answer> 
         <AnswerTitle>Oak</AnswerTitle> 
        </Answer> 
       </Answers> 
      </Question> 
      <Question> 
       <QuestionID>298</QuestionID> 
       <QuestionName>Windows or Mac?</QuestionName> 
       <Answers> 
        <Answer> 
         <AnswerTitle>Mac</AnswerTitle> 
        </Answer> 
        <Answer> 
         <AnswerTitle>Windows</AnswerTitle> 
        </Answer> 
       </Answers> 
      </Question> 
     </Questions> 
</QuestionnaireXML> 

:しかし

<QuestionnaireXML xmlns="http://schemas.datacontract.org/2004/07/QuestionnaireDescriptor" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <QuestionnaireName>Hello sir how do you do today?</QuestionnaireName> 
    <Questions> 
     <Question> 
      <Answers> 
       <Answer> 
        <AnswerTitle>Beech</AnswerTitle> 
       </Answer> 
       <Answer> 
        <AnswerTitle>Oak</AnswerTitle> 
       </Answer> 
      </Answers> 
      <QuestionID>297</QuestionID> 
      <QuestionName>What is your favorite type of tree?</QuestionName> 
     </Question> 
     <Question> 
      <Answers> 
       <Answer> 
        <AnswerTitle>Mac</AnswerTitle> 
       </Answer> 
       <Answer> 
        <AnswerTitle>Windows</AnswerTitle> 
       </Answer> 
      </Answers> 
      <QuestionID>298</QuestionID> 
      <QuestionName>Windows or Mac?</QuestionName> 
     </Question> 
    </Questions> 
</QuestionnaireXML> 

イムわからないが、これが原因である場合

この

は私がであることをXMLをご希望の注文ですつまり、私のループが間違った順序で行われているからです。 私のWCF XMLディスクリプタがここにあります。

[DataContract] 
    public class QuestionnaireXML 
    { 
     OsqarSQL getData; 
     DataTable DT; 
     private String _questionnaireName; 
     private List<Question> _Question = new List<Question>(); 

     public QuestionnaireXML(int QuestionnaireID) 
     { 
      // Loop through datatable for questionIDs and load the questions 
      getData = new OsqarSQL(); 
      _questionnaireName = getData.GetQuestionnaireName(QuestionnaireID); 
      DT = getData.GetQuestionIDWCF(QuestionnaireID); 
      for (int i = 0; i < DT.Rows.Count; i++) 
      { 
       _Question.Add(new Question(Int32.Parse(DT.Rows[i][0].ToString()))); 
      } 
     } 

     // Define DataMembers for XML output 
     [DataMember] 
     public String QuestionnaireName 
     { 
      get { return _questionnaireName; } 
      set { _questionnaireName = value; } 
     } 

     [DataMember] 
     public List<Question> Questions 
     { 
      get { return _Question; } 
      set { _Question = value; } 
     } 
    } 

    [DataContract] 
    public class Question 
    { 
     private Int32 _questionId; 
     private String _questionName; 
     OsqarSQL getData; 
     DataTable DT; 
     DataTable AT; 
     private List<Answer> _Answer = new List<Answer>(); 

     public Question(int QuestionID) 
     { 
      getData = new OsqarSQL(); 
      DT = getData.GetQuestionNameWCF(QuestionID); 
      _questionId = (int)DT.Rows[0][0]; 
      _questionName = DT.Rows[0][1].ToString(); 
      AT = getData.GetAnswerTitle(QuestionID); 
      for (int i = 0; i < AT.Rows.Count; i++) 
      { 
       _Answer.Add(new Answer(Int32.Parse(AT.Rows[i][0].ToString()))); 
      } 
     } 

     // Define DataMembers for XML output 
     [DataMember] 
     public Int32 QuestionID 
     { 
      get { return _questionId; } 
      set { _questionId = value; } 
     } 

     [DataMember] 
     public String QuestionName 
     { 
      get { return _questionName; } 
      set { _questionName = value; } 
     } 

     [DataMember] 
     public List<Answer> Answers 
     { 
      get { return _Answer; } 
      set { _Answer = value; } 
     } 
    } 

    [DataContract] 
    public class Answer 
    { 
     private Int32 _answerId; 
     private String _answerTitle; 
     OsqarSQL getData; 
     DataTable DT; 

     // Constructor Logic 
     public Answer(int AnswerID) 
     { 
      getData = new OsqarSQL(); 
      DT = getData.GetAnswerTitleWcf(AnswerID); 
      _answerTitle = DT.Rows[0][1].ToString(); 
     } 

     // Define DataMembers for XML output 
     [DataMember] 
     public String AnswerTitle 
     { 
      get { return _answerTitle; } 
      set { _answerTitle = value; } 
     } 
    } 

この問題を解決するにはどうすればよいですか? XMLを解析しようとすると問題が発生しますか?

+1

パーサーが要素の順序が固定であると予想される場合、解析時に問題が発生します。 –

+1

'どうすればこの問題を解決できますか? 'できません。それは問題ではありません:) –

+1

@MiserableVariable、パーサは固定された順序で期待していますか? Xドキュメント? XmlDocument? –

答えて

5

これは、私はXMLがでなりたいためである。

なぜ?これは必要ですか?私はそれがほぼ確実に必要でないことを賭けるだろう。

WCF DataContractSerializerは、デフォルトでアルファベット順にシリアル化します。表示されているXMLには、ノードがアルファベット順に並べられています。クラスのプロパティをどの順序でリストするかは関係ありません。

必要に応じてOrder属性(MSDN Data Member Orderを参照)を使用して要素の順序を指定できます。

もう1つの選択肢は、XMLSerializerを使用することです。これは、DataContractSerializerほど柔軟ではありませんが、単純ではありません。

これらの要素を再注文するにはが必要な場合を除き、私はそれを心配しません。

-1

これは、指定され、文書化された動作です。

前の表は 優先順位の高い順に収集インターフェイスを示しています。タイプは両方 のIListとジェネリックのIEnumerableを実装する場合、コレクションがシリアル化され且つ はIListの規則に従ってシリアル化解除することをこれは、例えば、意味:デシリアライゼーションで

、すべてのコレクションは、最初のインスタンス を作成することにより、デシリアライズされていますコレクションの型をシリアル化と逆シリアル化の両方で コレクションとして処理するシリアライザには、 が存在する必要がある既定のコンストラクタを呼び出します。

Collection Types in Data Contractsのドキュメントの「高度な収集ルール」のセクションを参照して、適用されるすべてのルールと、それらが存在する理由の説明について調べます。

0

私はあなたが得ている結果に何の問題も見ません。可変長または固定長のレコードに比べてXMLを使用する利点の1つは、データに誤った順序または他のタイプの構造のフィールドに耐性を持たせるための十分なメタデータがデータに含まれていることです。私はこの種の動作を強制するパーザーがあるかどうかはわかりませんが、そうしてはいけません。要素の順序はXMLでは重要ではありません。

+0

'要素の順序はXMLでは重要ではない' - これは厳密には当てはまりません。 WCF DataContractSerializerは、XMLを指定された順序で、またはアルファベット順に並べられないように要求します。本当のPITAです。 –

関連する問題