XML输出顺序错误
本文关键字:错误 顺序 输出 XML | 更新日期: 2023-09-27 18:23:35
我用C#编写了一个简单的WCF web服务,它从数据库中返回记录。
WCF使用以下方法:getQuestionnaireForID?id=(questionnaireID)
。Web服务从数据库中返回所有正确的记录,但是它们的顺序似乎不正确。
这是我希望XML的顺序:
<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时,它会引起问题吗?
这是我希望XML的顺序:
为什么?这有必要吗?我敢打赌,这几乎肯定没有必要。
WCF DataContractSerializer默认情况下按字母顺序进行序列化。您会注意到,您看到的XML具有按字母顺序排列的节点。列出类属性的顺序并不重要。
如果需要,可以使用Order
属性指定元素的顺序(请参见MSDN Data Member order)。
另一种选择是使用XMLSerializer,它更灵活,但没有DataContractSerializer那么简单。
除非有真正的需要重新订购这些元素,否则我不会关心它。
我认为您得到的结果没有任何问题。与可变或固定长度记录相比,使用XML的优势之一是,您的数据包含足够的元数据,使解析能够抵抗错误顺序的字段或任何其他类型的结构。我不确定是否有解析器可以强制执行这种行为,但它们不应该。元素顺序在XML中并不重要。
这是一个指定并记录的行为:
上表按的降序列出了集合接口优先这意味着,例如,如果一个类型同时实现IList和Generic IEnumerable,集合被序列化根据IList规则反序列化:
在反序列化时,通过首先创建通过调用默认构造函数来创建类型的实例,该构造函数必须存在,以便序列化程序将集合类型视为集合。
请参阅数据合同文档中收集类型的"高级收集规则"部分,了解所应用的所有规则以及对其存在原因的可能解释。