簡體   English   中英

將XML反序列化為C#對象

[英]Deserialize XML into a C# object

如何使用C#將以下CatalogProduct標記解除擴展到我的CatalogProduct對象?

<?xml version="1.0" encoding="UTF-8"?>
<CatalogProducts>
    <CatalogProduct Name="MyName1" Version="1.1.0"/>
    <CatalogProduct Name="MyName2" Version="1.1.0"/>
</CatalogProducts>

注意我沒有CatalogProducts對象,所以想要在拉回到反序列化時跳過該元素

謝謝

var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
    "<CatalogProducts>" +
        "<CatalogProduct Name=\"MyName1\" Version=\"1.1.0\"/>" +
        "<CatalogProduct Name=\"MyName2\" Version=\"1.1.0\"/>" +
    "</CatalogProducts>";
var document = XDocument.Parse(xml);

IEnumerable<CatalogProduct> catalogProducts =
        from c in productsXml.Descendants("CatalogProduct")
        select new CatalogProduct
        {
            Name = c.Attribute("Name").Value,
            Version = c.Attribute("Version").Value
        };

僅供參考,以下是如何真正序列化和反序列化對象的示例:

private CatalogProduct Load()
{
    var serializer = new XmlSerializer(typeof(CatalogProduct));
    using (var xmlReader = new XmlTextReader("CatalogProduct.xml"))
    {
        if (serializer.CanDeserialize(xmlReader))
        {
            return serializer.Deserialize(xmlReader) as CatalogProduct;
        }
    }
}

private void Save(CatalogProduct cp)
{
    using (var fileStream = new FileStream("CatalogProduct.xml", FileMode.Create))
    {
        var serializer = new XmlSerializer(typeof(CatalogProduct));
        serializer.Serialize(fileStream, cp);
    }
}

規范方法是兩次使用xsd.exe工具。 首先,從示例XML創建一個模式,如下所示:

xsd.exe file.xml將生成file.xsd。

然后:

xsd.exe /c file.xsd將生成file.cs.

File.cs將成為對象()你可以使用的,你可以很容易地發現這里的技術中的任何一個,例如反序列化的XML 這個

如果沒有“CatalogProduct”對象,我認為這很難,也許是動態類型的.net 4.0可能,但我不確定。

我知道的唯一方法是使用帶有Deserialize方法的XmlSerializer類,但是你需要對象CatalogProduct。

我希望以下鏈接很有用: http//blogs.msdn.com/b/alexghi/archive/2008/12/22/using-anonymous-types-to-deserialize-json-data.aspx

假設您的CatalogProduct對象看起來像這樣:

    public class CatalogProduct {
        public string Name;
        public string Version;
    }

我認為Linq to Xml將是最簡單,最快捷的方式

var cps1 = new[] { new CatalogProduct { Name = "Name 1", Version = "Version 1" },
                 new CatalogProduct { Name = "Name 2", Version = "Version 2" } };

var xml = new XElement("CatalogProducts", 
            from c in cps1
            select new XElement("CatalogProduct", 
                new XAttribute("Name", c.Name),
                new XAttribute("Version", c.Version)));

    // Use the following to deserialize you objects
var cps2 = xml.Elements("CatalogProduct").Select(x =>
    new CatalogProduct { 
        Name = (string)x.Attribute("Name"),
        Version = (string)x.Attribute("Version") }).ToArray();

請注意,.NET提供了我尚未顯示的真實對象圖序列化

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM