【问题标题】:Deserialize odd XML formant反序列化奇怪的 XML 共振峰
【发布时间】:2018-06-07 17:29:52
【问题描述】:

我正在处理一个以前从未见过的奇怪的 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,但一直在纠结。

【问题讨论】:

  • 你觉得这个文件有什么奇怪的地方?这是标准 XML。

标签: c# xml xml-parsing


【解决方案1】:

这是可以反序列化为对象的有效 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; }
}

【讨论】:

  • 根元素不是table吗?
  • 是的,你是对的。我相应地更新了我的答案。我读 XML 太快了。 :)
  • @Dan Wilson 干杯,这行得通,好吧,我现在有一个 System.OutOfMemoryException 但现在向前迈出了一步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 2015-07-10
  • 2014-04-25
相关资源
最近更新 更多