2013-07-03 23 views
1

我有下面的類的對象:序列化類爲「無效XML文檔」中的XML結果錯誤

public class Root 
{ 
    [XmlElement] 
    public BOMItems[] Row { get; set; } 
} 
public class BOMItems 
{ 
    [XmlElement("ITEMNO")] 
    public string ITEMNO { get; set; } 
    [XmlElement("USED")] 
    public string USED { get; set; } 
    [XmlElement("PARTSOURCE")] 
    public string PARTSOURCE { get; set; } 
    [XmlElement("QTY")] 
    public string QTY { get; set; } 
} 

我想它用這種方法序列化爲XDocument

public XDocument TransformClassToXMLBOM(Root rt) 
{ 
    var serializer = new XmlSerializer(typeof(Root)); 
    var sww = new StringWriter(); 
    var settings = new XmlWriterSettings(); 
    settings.ConformanceLevel = ConformanceLevel.Auto; 
    var writer = XmlWriter.Create(sww, settings); 

    serializer.Serialize(writer, rt); 

    var doc = new XDocument( 
        new XElement("Row", 
         new XElement("ITEMNO"), 
         new XElement("USED"), 
         new XElement("PARTSOURCE"), 
         new XElement("QTY")));           
    doc.Save(writer); 
    return doc; 
} 

我甚至嘗試過在new XElement("Row",之前插入一個額外的元素:

var doc = new XDocument( 
       new XElement("Root", 
        new XElement("Row",... 

我總是在這條線以下doc.Save(writer);錯誤:

令牌StartDocument狀態EndRootElement會導致一個無效 XML文件內。如果您希望 寫入XML片段,請確保一致性級別設置爲 設置爲ConformanceLevel.Fragment或ConformanceLevel.Auto。

起初我以爲我可能會錯過一個XElement或有拼寫錯誤,但我找不到任何錯誤。我不知道如何查看writer中的值來檢查結果,所以我不知道如何找到解決方案。

,我想的是這樣結束:

<Root> 
    <Row> 
    <ITEMNO>1</ITEMNO> 
    <USED>Y</USED> 
    <PARTSOURCE>BUY</PARTSOURCE> 
    <QTY>10</QTY> 
    </Row> 
</Root> 

如何找到問題的原因是什麼?什麼是實現我想要的結果的正確方法?

+0

你想實現什麼?你能清楚地陳述你的輸出嗎? –

+1

我想將根對象轉換爲XML字符串 – davids

+0

請參閱我的下面的答案..是你想要的嗎? –

回答

3

檢出Xml可序列化的通用字典 http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx 你可以做你的情況幾乎相同。

UPD 然後你可以使用非標準serializartion這樣

public static string SerializeObjectToXml<T>(T obj) 
    { 
     MemoryStream memoryStream = new MemoryStream(); 
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 
     XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 

     xmlSerializer.Serialize(xmlTextWriter, obj); 
     memoryStream = (MemoryStream)xmlTextWriter.BaseStream; 

     string xmlString = ByteArrayToStringUtf8(memoryStream.ToArray()); 

     xmlTextWriter.Close(); 
     memoryStream.Close(); 
     memoryStream.Dispose(); 

     return xmlString; 
    } 

UPD2

public static string ByteArrayToStringUtf8(byte[] value) 
    { 
     UTF8Encoding encoding = new UTF8Encoding(); 
     return encoding.GetString(value); 
    } 

upd3

更cleare方式連載侑類:

[Serializable] 
public class Root 
{ 
    [XmlElement("ITEMS")] 
    public BOMItem[] Row { get; set; } 
} 

[Serializable] 
public class BOMItem 
{ 
    [XmlElement("ITEMNO")] 
    public string ITEMNO { get; set; } 
    [XmlElement("USED")] 
    public string USED { get; set; } 
    [XmlElement("PARTSOURCE")] 
    public string PARTSOURCE { get; set; } 
    [XmlElement("QTY")] 
    public string QTY { get; set; } 
} 

所以你可以得到你的xml是這樣的:

 Root r1 = new Root(); 
     r1.Row = new BOMItem[2]; 
     r1.Row[0] = new BOMItem {ITEMNO = "1", PARTSOURCE = "11", QTY = "111", USED = "1111"}; 
     r1.Row[1] = new BOMItem { ITEMNO = "2", PARTSOURCE = "22", QTY = "222", USED = "2222" }; 
     MessageBox.Show(String.Format("Serialization result: {0}", SerializeObjectToXml(r1))); 
+0

這有什麼用?我沒有看到它如何演示如何序列化自定義類。 – davids

+0

Implemet ISerializable接口在你的類中,你會好的 – DimDim

+0

你在哪裏得到/定義'ByteArrayToStringUtf8'? – davids