2011-09-17 66 views
2

的系列化型我有這樣的結構:Xml序列 - 改變XML

public struct Vehicles 
{ 
    public string Name { get; set; } 
    public string Count { get; set; } 
    public List<Car> Cars { get; set; } 
} 

public struct Car 
{ 
    public string Name { get; set; } 
    public int Count { get; set; } 
    public List<Tire> Tires { get; set; } 
} 

public struct Tire 
{ 
    public string Brand { get; set; } 
    public int Count { get; set; } 
    public int UniqueCount { get; set; } 
    public List<Dimension> Dimensions { get; set; } 
} 

public struct Dimension 
{ 
    public string Size { get; set; } 
    public int AlternateSize { get; set; } 
} 

當我序列化「車」,它是這樣的:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org /2001/XMLSchema"> 
    <Vehicles> 
    <Name>SuperVehicles</Name> 
    <Cars> 
     <Car> 
     <Name>BMW</Name> 
     <Count>29</Count> 
     <Tires> 
      <Tire> 
      <Name>DMZ</Name> 
      <Count>26</Count> 
      <UniqueCount>24</UniqueCount> 
      <Dimensions> 
       <Dimension> 
       <Size>70x570</Size> 
       <AlternateSize>70x580</AlternateSize> 
       </Dimension> 
       <Dimension> 
       <Size>60x570</Size> 
       <AlternateSize>60x580</AlternateSize> 
       </Dimension> 
       <Dimension> 
       <Size>50x570</Size> 
       <AlternateSize>50x580</AlternateSize> 
       </Dimension> 
      </Dimensions> 
      </Tire> 
     </Tires> 
     </Car> 
    </Cars> 
    </Vehicles> 
</root> 

現在的問題是,我想以這樣的方式將其序列化:

<root> 
    <vehicles vehicleName="superVehicles" vehicleCount="50" carName="BMW" 
     carCount="25" tireBrand="kamu" tireCount="15" tireUniqueCount="15" 
     dimensionSize="70x570" dimensionAlternateSize="70x580" /> 
    <vehicles vehicleName="superVehicles" vehicleCount="35" carName="MERCEDES" 
     carCount="22" tireBrand="kamu" tireCount="12" tireUniqueCount="12" 
     dimensionSize="60x570" dimensionAlternateSize="60x580" /> 
    <vehicles vehicleName="superVehicles" vehicleCount="35" carName="PORSCHE" 
     carCount="22" tireBrand="kamu" tireCount="12" tireUniqueCount="12" 
     dimensionSize="60x570" dimensionAlternateSize="60x580" /> 
</root> 

我是否必須更改結構並避免分組,或者有什麼方法可以創建e用於XML序列化的模式以收集此結果。我將所有的子項放在一個新的標籤中,當我將根結構序列化到xml中,但我需要把它們作爲一個實例的屬性,只創建根(在這種情況下的車輛)的元素數的行到XML。

+0

抱歉沒有看到您正在編輯它。隨意回滾,如果我搞砸了:) –

+0

@Merlyn不!我搞砸了。無法修復顯示xml代碼塊的權利。請幫助我,這將是很好的告訴我如何做到這一點(: –

+0

我有XML顯示在我的編輯... –

回答

1

您需要手動序列化。

這裏是你如何實現這一點使用System.Xml.Linq的:

var xmlElementsVehicles = new[]{ 
            new XElement("vehicles ", new object[] 
            { 
            new XElement("vehicleName", "superVehicles"), 
            new XElement("vehicleCount", 35), 
            new XElement("carName", "PORSCHE"), 
            new XElement("carCount", 2) 
            }), 
            new XElement("vehicles ", new object[] 
            { 
            new XElement("vehicleName", "superVehicles"), 
            new XElement("vehicleCount", 35), 
            new XElement("carName", "PORSCHE"), 
            new XElement("carCount", 2) 
            }) 
           }; 
var root = new XElement("root", xmlElementsVehicles); 
var myXml = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), root); 
using (var xmlWriter = XmlWriter.Create(stream)) 
{ 
    myXml.Save(xmlWriter); 
} 
+0

哦,謝謝你。我猜這裏沒有自動配置,就像我可以定義一個模式並使用它,對吧? –

+0

@Beytan:No ,沒有什麼是自動的,有[你可以在你的數據類型上實現的接口](http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx)到告訴Xml序列化器使用這個實現,雖然。 –

1

要使用XmlSerializer的模型必須大致是一樣的佈局;幾件事情可以改變(名字等)。但是,您的模型是,就像的XML一樣。三個選項,然後:

  • 創建第二個DTO模式,看起來像XML(可使用XSD.EXE的示例XML自動執行此),並使用XmlSerializer的
  • 不使用XmlSerializer的,但構建XML莫名其妙其他(XmlDocument的或的XDocument將是顯而易見的兩個或XmlWriter的,如果大小是非常大)
  • 使用類似XSLT寫

後重塑XML沒有什麼「易」可以這樣做是爲了讓XmlSerializer將該模型寫入所需的XML中。

+0

我顧ess xslt是正確的答案,但提供一個簡短的例子會很好。 –

+0

@Beytan哪個?有3個選項,所有相當多的工作... –

+0

到xslt之一。第一個對我來說並不容易。第二個是我想的一個小手冊,但不知道。第三個是有點自動化我想,我理解它:創建這個XML並提供一個xslt來操縱它,對吧? –