2

我有这个 XML 字符串

<Root>
  <Row>
    <ITEMNO>1</ITEMNO>
    <PARTSOURCE>Buy</PARTSOURCE>
    <QTY>2</QTY>
    <CUSTPARTNO>469</CUSTPARTNO>
    <DESCRIPT>35W 1/4W 5%</DESCRIPT>
  </Row>
  <Row>
    <ITEMNO>3</ITEMNO>
    <PARTSOURCE>Buy</PARTSOURCE>
    <QTY>5</QTY>
    <CUSTPARTNO>116</CUSTPARTNO>
    <DESCRIPT>1.74K 1/8W 1% Film</DESCRIPT>
  </Row>
  <Row>
    <ITEMNO>2</ITEMNO>
    <PARTSOURCE>MAKE</PARTSOURCE>
    <QTY>5</QTY>
    <CUSTPARTNO>651321</CUSTPARTNO>
    <DESCRIPT>Make Part</DESCRIPT>
  </Row>
</Root>

我正在尝试将其反序列化为Root此类

public class Root
{
    public BOMItems Row { get; set; }
}
public class BOMItems
{
    public string ITEMNO { get; set; }
    public string USED { get; set; }
    public string PARTSOURCE { get; set; }
    public string QTY { get; set; }
    public string CUSTPARTNO { get; set; }
    public string CREV { get; set; }
    public string DESCRIPT{ get; set; }
}

使用这种方法:

public Root TransformXMLToClass(string pXml)
{
    var serializer = new XmlSerializer(typeof(Root));
    XmlReader reader = XmlReader.Create(new StringReader(pXml));

    return (Root)serializer.Deserialize(reader);
}

这仅适用于第一个节点。

我尝试过Root像这样更改课程:

    public List<BOMItems> Row{get;set;}

它不适用于任何节点

如何让它反序列化所有节点?

4

2 回答 2

3

在你的情况下,这很简单。您只需要告诉序列化程序如何处理元素的集合。

您确实需要将属性作为集合或数组,如下所示:

public class Root
{
    [XmlElement("Row")]
    public BOMItems[] Row { get; set; }
}

“[XmlElement]”将告诉它如何正确反序列化。添加 XmlElementAttribute 会告诉序列化程序将其视为“平面”序列。

<!-- Row Elements Flattened -->
<Root>
  <Row>
    <ITEMNO>1</ITEMNO>
    <PARTSOURCE>Buy</PARTSOURCE>
    <QTY>2</QTY>
    <CUSTPARTNO>469</CUSTPARTNO>
    <DESCRIPT>35W 1/4W 5%</DESCRIPT>
  </Row>
  <Row>
    <ITEMNO>3</ITEMNO>
    <PARTSOURCE>Buy</PARTSOURCE>
    <QTY>5</QTY>
    <CUSTPARTNO>116</CUSTPARTNO>
    <DESCRIPT>1.74K 1/8W 1% Film</DESCRIPT>
  </Row>
</Root>

    <!-- Versus Row Elements Unflattened -->
<Root>
  <Row>
    <BOMItems>
      <ITEMNO>1</ITEMNO>
      <PARTSOURCE>Buy</PARTSOURCE>
      <QTY>2</QTY>
      <CUSTPARTNO>469</CUSTPARTNO>
      <DESCRIPT>35W 1/4W 5%</DESCRIPT>
    </BOMItems>
    <BOMItems>
      <ITEMNO>3</ITEMNO>
      <PARTSOURCE>Buy</PARTSOURCE>
      <QTY>5</QTY>
      <CUSTPARTNO>116</CUSTPARTNO>
      <DESCRIPT>1.74K 1/8W 1% Film</DESCRIPT>
    </BOMItems>
  </Row>
</Root>
于 2013-07-03T05:54:11.890 回答
1

您的 BOM 类应如下所示,

[XmlElement("ITEMNO")]
public string ITEMNO { get; set; }

以便通知序列化程序您读取了ITEMNO并将其保存在ITEMNO中

编辑:必须为 BOM 类的每个属性完成。

答:(附清单)

public class Root
{
    [XmlElement("Row")]
    public List<BOMItems> Row { get; set; }
}
public class BOMItems
{
    [XmlElement("ITEMNO")]
    public string ITEMNO { get; set; }
    [XmlElement("USED")]
    public string USED { get; set; }
    [XmlElement("PARTSOURCE")]
    public string PARTSOURCE { get; set; }
    [XmlElement("QTY")]
    public string QTY { get; set; }
    [XmlElement("CUSTPARTNO")]
    public string CUSTPARTNO { get; set; }
    [XmlElement("CREV")]
    public string CREV { get; set; }
    [XmlElement("DESCRIPT")]
    public string DESCRIPT { get; set; }
}
class Program
{
    static void Main(string[] args)
    {

        var serializer = new XmlSerializer(typeof(Root));
        var reader = XmlReader.Create(new StringReader(File.ReadAllText("c:\\tet.xml")));

        var serializedOutput = (Root)serializer.Deserialize(reader);
        Console.ReadKey();
    }
于 2013-07-03T05:48:17.553 回答