代码之家  ›  专栏  ›  技术社区  ›  Ashley Kilgour

反序列化奇数XML共振峰

  •  0
  • Ashley Kilgour  · 技术社区  · 6 年前

    我正在处理一个奇怪的xml格式的文件,这是我以前从未见过的。(我很确定这不是XML,只要给我一个名为download.xml的文件,如果有人告诉我是什么,我就会改变问题)

    我得到它作为一个平面文本文件,我必须加载,而不是从一个流。

    它是从第三方应用程序生成的,我无法更改。

    我不知道如何反序列化成任何类型的对象。

    我不在乎它是什么,只要它不是一根绳子。 这是一个格式错误的数据集

    <table name="tbl_user" entire="Y">
      <columns>
         <column name="user_id" class="java.lang.Long" type-id="-5" db-type="bigint" />
         <column name="name" class="java.lang.String" length="255" type-id="12" db-type="varchar" />
         <column name="surnname" class="java.lang.String" length="255" type-id="12" db-type="varchar" />  
       </columns>
       <row><v>1</v><v> John</v><v>Lennon</v> </row>
       <row><v>2</v><v>Paul</v><v>McCartney</v></row>
       <row><v>3</v><v>George</v><v>Harrison</v></row>
       <row><v>4</v><v>Ringo</v><v>Starr</v></row>
    </table>
    

    我一直在玩xdocument、xnode、datatables、xmlserializer,但一直在纠结。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Dan Wilson    6 年前

    这是可以反序列化为对象的有效XML。

    我所做的就是用一个免费的在线工具生成一个类( http://xmltocsharp.azurewebsites.net/ )

    您也可以使用 xsd.exe utility

    可以根据需要修改数据类型(例如,应该是整数的字符串)。

    void Main()
    {
        var xml = @"
      <table name=""tbl_user"" entire=""Y"">
         <columns>
            <column name=""user_id"" class=""java.lang.Long"" type-id=""-5"" db-type=""bigint"" />
            <column name=""name"" class=""java.lang.String"" length=""255"" type-id=""12"" db-type=""varchar"" />
            <column name=""surnname"" class=""java.lang.String"" length=""255"" type-id=""12"" db-type=""varchar"" />  
         </columns>
         <row><v>1</v><v> John</v><v>Lennon</v> </row>
         <row><v>2</v><v>Paul</v><v>McCartney</v></row>
         <row><v>3</v><v>George</v><v>Harrison</v></row>
         <row><v>4</v><v>Ringo</v><v>Starr</v></row>
      </table>";
    
        var serializer = new XmlSerializer(typeof(Table));
        var table = serializer.Deserialize(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml))) as Table;
        Console.WriteLine($"{table.Columns.Column.Count} columns");
        Console.WriteLine($"{table.Row.Count} rows");
    
        // Output:
        // 3 columns
        // 4 rows
    
    }
    
    [XmlRoot(ElementName = "column")]
    public class Column
    {
        [XmlAttribute(AttributeName = "name")]
        public string Name { get; set; }
        [XmlAttribute(AttributeName = "class")]
        public string Class { get; set; }
        [XmlAttribute(AttributeName = "type-id")]
        public string Typeid { get; set; }
        [XmlAttribute(AttributeName = "db-type")]
        public string Dbtype { get; set; }
        [XmlAttribute(AttributeName = "length")]
        public string Length { get; set; }
    }
    
    [XmlRoot(ElementName = "columns")]
    public class Columns
    {
        [XmlElement(ElementName = "column")]
        public List<Column> Column { get; set; }
    }
    
    [XmlRoot(ElementName = "row")]
    public class Row
    {
        [XmlElement(ElementName = "v")]
        public List<string> V { get; set; }
    }
    
    [XmlRoot(ElementName = "table")]
    public class Table
    {
        [XmlElement(ElementName = "columns")]
        public Columns Columns { get; set; }
        [XmlElement(ElementName = "row")]
        public List<Row> Row { get; set; }
        [XmlAttribute(AttributeName = "name")]
        public string Name { get; set; }
        [XmlAttribute(AttributeName = "entire")]
        public string Entire { get; set; }
    }