2010-05-03 21 views
0

我有這樣的事情(遺憾的壞話)如何爲此做一個序列化類?

<?xml version="1.0" encoding="utf-8" ?> 
    <root xmlns="http://www.domain.com" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.domain.com Schema.xsd"> 
     <product></product> 
     <SomeHighLevelElement> 
     <anotherElment> 
       <lowestElement> </lowestElement> 
     </anotherElment> 
     </SomeHighLevelElement> 
    </root> 

我有這樣的事情我的課

public class MyClass 
{ 
    public MyClass() 
    { 
     ListWrapper= new List<UserInfo>(); 
    } 


    public string product{ get; set; } 


    public List<SomeHighLevelElement> ListWrapper{ get; set; } 


} 

public class SomeHighLevelElement 
{ 

    public string lowestElement{ get; set; } 
} 

但我不知道怎麼寫的代碼爲「另一個元素「不確定是否必須再製作一個包裝。

編輯

我知道在我實際的XML文件得到一個錯誤。我有這個在我的標籤

xmlns="http://www.domain.com" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.Domain.com Schema.xsd 

在根行上拋出一個異常,說這個東西有錯誤。所以我不知道它是否對schemaLocation感到憤怒,因爲我現在正在使用本地主機或者什麼。

錯誤

System.InvalidOperationException was caught 
    Message="There is an error in XML document (2, 2)." 
    Source="System.Xml" 
+0

後實際的XML,而不是你認爲的摘錄可能是相關的。 – 2010-05-04 01:12:59

+0

好的,我更新了原來用我認爲在崩潰的那一行崩潰的行的XML。它只是說錯誤Xml 2,2。 – chobo2 2010-05-04 01:17:33

+1

如果這真的是你的XML,那麼它是畸形的; 'xsi:schemaLocation'缺少一個結束引用(它也有一個空格,通常不應該在那裏)。 – Aaronaught 2010-05-04 01:18:52

回答

2

下面是根據您所提供的信息一個簡單的例子。基本上,您需要爲anotherElment製作一個單獨的課程,其中包含string

您可以使用attributes精確地控制您的類如何分析Xml元素,它基本上將您的類屬性映射到Xml文件中的元素/屬性。因此,例如,由於您提供的示例Xml中的文檔元素是root,因此我明確定義MyClass具有名爲root的文檔元素以與您的Xml匹配。默認情況下,序列化程序將查找名爲MyClass的元素,如果省略它,反序列化方法將拋出。

這應該有助於讓你去:

using System; 
using System.Collections.Generic; 
using System.Xml; 
using System.Xml.Serialization; 

[XmlRoot("root")] 
public class MyClass 
{ 
    public MyClass() 
    { 

    } 

    public string product { get; set; } 

    [XmlElement("SomeHighLevelElement")] 
    public List<SomeHighLevelElement> ListWrapper { get; set; } 

} 

public class SomeHighLevelElement 
{ 
    public AnotherElment anotherElment { get; set; } 
} 

public class AnotherElment 
{ 
    public string lowestElement { get; set; } 
} 

進行了抽樣檢測方法,根據您提供的XML:

using System.Xml; 
using System.Xml.Serialization; 
using System.IO; 
. 
. 
. 
public void Test() 
{ 
    string xml = @"<root> 
        <product>product name</product> 
        <SomeHighLevelElement> 
        <anotherElment> 
         <lowestElement>foo</lowestElement> 
        </anotherElment> 
        </SomeHighLevelElement> 
        <SomeHighLevelElement> 
        <anotherElment> 
         <lowestElement>bar</lowestElement> 
        </anotherElment> 
        </SomeHighLevelElement> 
        <SomeHighLevelElement> 
        <anotherElment> 
         <lowestElement>baz</lowestElement> 
        </anotherElment> 
        </SomeHighLevelElement> 
       </root>"; 
    MyClass c = Deserialize<MyClass>(xml); 
} 

public T Deserialize<T>(string xml) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(T)); 
    return (T)serializer.Deserialize(new StringReader(xml)); 
} 
+0

啊我接近我的當前版本但是我現在在我的xml文檔中出錯。我會在我原來的帖子中發佈我的東西 – chobo2 2010-05-04 00:49:28

+0

還有一件事我如何使其驗證。例如,我從我導入的xml文檔中移除了我的產品標籤。我預料它會拋出異常,但它繼續這是很快樂的方式,如果缺少,我希望它拋出一個異常,我該怎麼做。 – chobo2 2010-05-04 02:41:14