我有一個xsd文件,由外部公司定義,我使用xsd.exe生成類。我可以使用提供的xml文件來反序列化使用生成的類的對象,但是在少數情況下,我需要將xml的較小部分作爲XDocument。我不知道這些部分,直到運行時的路徑,所以我使用XML爲:如何獲取序列化對象與原始源XML文件相同?
XElement element = xml.XPathSelectElement(path);
我有是序列化的結果不匹配傳入的XML完全正確的問題,這使得select返回null。我如何獲得一個序列化的對象看起來像傳入的文件?我可能使用xsd.exe錯誤地生成類嗎?我最終需要使用相同的生成代碼來生成我自己的XML文件。
這裏是我目前使用序列化
var xml = new XDocument();
using (var writer = xml.CreateWriter())
{
List<Type> known = new List<Type>();
known.Add(typeof(ObjType1));
...
var serializer = new DataContractSerializer(typeof(Detail), known);
serializer.WriteObject(writer, sourceDetailObj);
}
串行化結果代碼:
<Detail xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/CustomNameSpace">
...
<numberField>1</numberField>
<detailTypeField>
<objField i:type="ObjType1">
<valObjField i:nil="true" />
...
</objField>
</detailTypeField>
...
</Detail>
它應該是什麼樣子:
<Detail>
...
<Number>1</Number>
<DetailType>
<ObjType1>
...
</ObjType1>
</DetailType>
...
</Detail>
這裏的課程之一xsd生成:
public partial class DetailType {
private object objField;
[System.Xml.Serialization.XmlElementAttribute("ObjType1", typeof(ObjType1))]
...
public object Obj {
get {
return this.objField;
}
set {
this.objField = value;
}
}
}
Obj可以是幾個類之一。
快速嘗試(如果你還沒有)是使用'XmlSerializer'而不是'DataContractSerializer',看看是否解決了你的問題。它們不一定產生相同的輸出。 – DeanOC
@DeanOC是的,解決了它!這產生了與源文件幾乎完全相同的xml。 – matt
很酷。我將添加它作爲答案。 – DeanOC