1

以下のxmlを逆シリアル化する必要があります。私はそれに(もっと)精通しているので、xmlserializerを使いたいです。この xml は正しく構築されていないと思いますが、変更できません。以下は、カテゴリ オブジェクトのリストを表しています。を使用してデシリアライズしようとすると

xmlserializer(typeof(List<Category>))

次のエラーが表示されます:「categories xmlns='' is not expected」

<?xml version="1.0" encoding="utf-8" ?>
<categories>
  <category id="16" name="Exports" parent_id="13"/>
  <category id="17" name="Imports" parent_id="13"/>
  <category id="3000" name="Income Payments & Receipts" parent_id="13"/>
  <category id="125" name="Trade Balance" parent_id="13"/>
  <category id="127" name="U.S. International Finance" parent_id="13"/>
</categories>

それが私がしなければならないことであれば、これらをデシリアライズするためにある種のダミークラスを作成してもかまいません。これが私のカテゴリクラスです

[XmlType("category")]
 public class Category
 {


    [XmlAttribute("id")]
    public int ID { get; set; }

    [XmlAttribute("parent_id")]
    public int ParentID { get; set; }

    [XmlAttribute("name")]
    public string Name { get; set; }
}

私のコード:

    XmlSerializer serializer = new XmlSerializer(typeof(List<Category>));
    StringReader reader = new StringReader(xml);
    List<Category> obj = null;

    using (System.Xml.XmlReader xmlReader = System.Xml.XmlReader.Create(reader))
    {
        obj = (List<Category>)serializer.Deserialize(xmlReader);
    }
        return obj;
4

3 に答える 3

3

XmlRootAttribute「カテゴリ」部分のシリアライザーにを渡すことができます。

しかし...有効ではないため、xmlから「&」を削除する必要があります

XmlSerializer serializer = new XmlSerializer(typeof(List<Category>), new XmlRootAttribute("categories"));

using (FileStream fileStream = new FileStream(@"C:\Test.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    var test = serializer.Deserialize(fileStream);
}

ここに画像の説明を入力してください

String.Replaceこれが、「&」を整理するために使用するメソッドです。

    private List<Category> GetCategories(string xmlData)
    {
        List<Category> obj = null;
        XmlSerializer serializer = new XmlSerializer(typeof(List<Category>), new XmlRootAttribute("categories"));
        StringReader reader = new StringReader(xmlData.Replace("&","&amp;"));
        using (System.Xml.XmlReader xmlReader = System.Xml.XmlReader.Create(reader))
        {
            obj = (List<Category>)serializer.Deserialize(xmlReader);
        }
        return obj;
    }
于 2013-01-29T07:56:12.103 に答える
1

List<Category>次のようなものを含むカテゴリ クラスを作成してみてください。

[XmlRoot("categories")]
public class Categories
{
    public Categories() 
    {
       Items = new List<User>();
    }

    [XmlElement("category")]
    public List<Category> Items {get;set;}
}

次のようなシリアライザーを作成できます。

XmlSerializer serializer = new XmlSerializer(typeof(Categories));
于 2013-01-29T07:40:37.027 に答える
0

この XML が準拠すべき XSD はありますか? その場合、「xsd your.xsd /classes」を使用して必要なコードを生成できます。

于 2013-01-29T08:52:38.413 に答える