我有以下的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));
请帮我把它重新载入
答案 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.Linq
和System.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);
}