2011-12-06 65 views
2

這是我嘗試反序列化的XML文件:無法反序列化只有一個節點的XML文件;根節點

<?xml version="1.0" encoding="utf-8"?> 
<d:MyItem xmlns:d="http://someurl" xmlns:m="http://someotherurl">This is a string</d:MyItem> 

xsd tool生成以下類:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://someurl")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://someurl", IsNullable=false)] 
public partial class MyItem { 

    private object[] itemsField; 

    /// <remarks/> 
    public object[] Items { 
     get { 
      return this.itemsField; 
     } 
     set { 
      this.itemsField = value; 
     } 
    } 
} 

我目前正試圖反序列化相同的XML xsd用於生成類:

var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<d:MyItem xmlns:d=\"http://someurl\" xmlns:m=\"http://someotherurl\">This is a string</d:MyItem>"; 
var deserialized = Deserialize<MyItem>(xml); 

其中Deserialize<>是:

private static T Deserialize<T>(string xml) 
{ 
    var xmlDocument = XDocument.Parse(xml); 
    var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T)); 
    return (T)serializer.Deserialize(xmlDocument.CreateReader()); 
} 

的問題是,雖然Deserialize返回一個實例(不爲空),它裏面的屬性Itemsnull即它沒有被反序列化。

我怎樣才能從這個XML裏面得到字符串?

回答

0

你的xml看起來不正確,嘗試序列化這個類的一個實例,並看看生成的xml。我認爲,必須有像

<?xml version="1.0" encoding="utf-8"?> 
<d:MyItem xmlns:d="http://someurl" xmlns:m="http://someotherurl"> 
<ArrayOfItems> 
<Item>...</Item> 
... 
</ArrayOfItems> 
</d:MyItem> 

如果要反序列化的XML,你應該有一個類

public partial class MyItem { 

/// <remarks/> 
public String Item{ get; set; } 
} 

,並在XML

<?xml version="1.0" encoding="utf-8"?> 
<d:MyItem xmlns:d="http://someurl" xmlns:m="http://someotherurl"> 
<Item>some text</Item>  
</d:MyItem> 
+0

但是是不是有你如何可以序列我張貼的XML的方法嗎? –

+0

其實你可以。嘗試這樣的事情 [XmlRoot(的ElementName = 「項目」,數據類型= 「字符串」) 公共部分類MyItem { /// 公共字符串項{獲取;集;}} – Eugene

+0

感謝您的建議,但它仍然沒有工作。 –

0

有問題,你XML,如果你使用這個XML,那麼你可以使用你的代碼使之無效化。

var xml = "<MyItem xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://someurl\"> <Items> <anyType xsi:type=\"xsd:string\">This is string</anyType> </Items></MyItem>"; 

這會給你從你的XML內的串

3

XSD.EXE期待您的文檔根元素是一個複雜的類型,但在你的情況下,它是一個簡單的字符串,所以內各種假設XSD.exe導致問題。它產生的錯誤模式只是幾個問題中的第一個。

最簡單的辦法是忽略XSD.EXE和剛剛創建自己的XML序列化類:

[System.SerializableAttribute()] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://someurl")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://someurl", IsNullable = false)] 
public partial class MyItem 
{ 
    [System.Xml.Serialization.XmlTextAttribute] 
    public string Value { get; set; } 
} 

而且,我不知道你爲什麼在反序列化使用XDocument.Parse。你可以把它簡化這樣的:

private static T Deserialize<T>(string xml) 
{ 
    var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T)); 
    return (T)serializer.Deserialize(new StringReader(xml)); 
} 

下面是完整的工作代碼:

using System; 
using System.IO; 
using System.Xml; 
using System.Xml.Serialization; 

namespace ConsoleApplication1 
{ 
    [System.SerializableAttribute()] 
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://someurl")] 
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://someurl", IsNullable = false)] 
    public partial class MyItem 
    { 
     [System.Xml.Serialization.XmlTextAttribute] 
     public string Value { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<d:MyItem xmlns:d=\"http://someurl\" xmlns:m=\"http://someotherurl\">This is a string</d:MyItem>"; 
      var deserialized = Deserialize<MyItem>(xml); 
      // Result: deserialized.Value == "This is a string" 
     } 

     private static T Deserialize<T>(string xml) where T : new() 
     { 
      var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T)); 
      return (T)serializer.Deserialize(new StringReader(xml)); 
     } 
    } 
}