使用XmlSerializer反序列化XML

时间:2012-10-18 19:07:56

标签: c# xml-parsing

我有以下的XML

<?xml version="1.0" ?>
<SERVICES.OUTPUTResponse>
  <Results>
    <Result>
      <Dataset name="OutputData">
        <Row>
            <country>USA</country>
            <pubyear>9986</pubyear>       
            <numart>123</numart>
            <numcites>456</numcites>
        </Row>
        <Row>
            <country>USA</country>
            <pubyear>97</pubyear>
            <numart>895</numart>
            <numcites>231</numcites>
        </Row>
      </Dataset>
      <Dataset name="Result 2">
        <Row>
          <Result_2>
            true
          </Result_2>
        </Row>      
      </Dataset>
    </Result>
  </Results>
  <_Probe></_Probe>
</SERVICES.OUTPUTResponse>

我试图通过使用XmlSerializer反序列化,但它返回null。

我使用的Property类是

  

公共类XMLDetails       {

    public string country { get; set; }

    public string pubyear { get; set; }

    public string numart { get; set; }

    public string numcites { get; set; }
}

反序列化代码

XmlRootAttribute xRoot = new XmlRootAttribute();
                xRoot.ElementName = "SERVICES.OUTPUTResponse";   
                                xRoot.IsNullable = true;
                var serializer = new XmlSerializer(typeof(XMLDetails), xRoot);
                var reader = new StringReader(remoteXml);
var objpublication = (XMLDetails)(serializer.Deserialize(reader));

请帮我把它重新载入

2 个答案:

答案 0 :(得分:1)

如果您想使用Linq To Xml

XDocument xDoc = XDocument.Parse(xml); //or XDocument.Load(filename);

var rows = xDoc.XPathSelectElement("//Dataset[@name='OutputData']")
            .Descendants("Row")
            .Select(r => new XMLDetails
            {
                country = r.Element("country").Value,
                pubyear = r.Element("pubyear").Value,
                numart = r.Element("numart").Value,
                numcites = r.Element("numcites").Value,
            })
            .ToList();

PS:必需的名称空间System.Xml.LinqSystem.Xml.XPath

答案 1 :(得分:0)

首先,您需要使用xsd.exe生成.xsd(架构)文件和.cs(类)文件

XML Schema Definition Tool (Xsd.exe)

您可以运行“Visual Studio命令提示符”,并且已经定义了xsd.exe路径定义,可以使用它。

在控制台中键入以下命令 *我假设您的xml保存在“yourxmlfile.xml”

>xsd.exe yourxmlfile.xml

此命令将生成“yourxmlfile.xsd”文件

然后执行以下命令以生成.cs文件 但在改变之前

<xs:element name="Results" minOccurs="0" maxOccurs="unbounded">符合 生成的xsd文件中的<xs:element name="Results" minOccurs="0" maxOccurs="1"> (将结果更改为属性而不是数组属性)

>xsd.exe yourxmlfile.xsd /c

此命令将生成“yourxmlfile.cs”

现在您可以将此文件添加到项目中,并且可以反序列化xml文件,如下所示

        var serializer = new XmlSerializer(typeof(SERVICESOUTPUTResponse));
        SERVICESOUTPUTResponse instance = null;
        using (var fileStream = File.OpenRead(@"c:\path_to\yourxmlfile.xml"))
        {
            instance = (SERVICESOUTPUTResponse)serializer.Deserialize(fileStream);
        }