我有这样的XML:
<job>
<properties>
<name>jobid</name>
<value>81963</value>
</properties>
<properties>
<name>status</name>
<value>complete</value>
</properties>
<properties>
<name>date</name>
<value>2018-07-30</value>
</properties>
</job>
<job>
<properties>
<name>jobid</name>
<value>81194</value>
</properties>
<properties>
<name>status</name>
<value>complete</value>
</properties>
<properties>
<name>date</name>
<value>2018-07-30</value>
</properties>
</job>
我需要做的是获取每个作业的所有属性。我很难遍历其节点和子节点,但无法获得确切的逻辑。我真正需要做的是将这些数据转换为类似的内容:
[{
"jobid": "81963",
"status": "complete",
"date": "2018-07-30"
},
{
"jobid": "81194",
"status": "complete",
"date": "2018-07-30"
}]
我已经尝试过:
foreach (XmlNode child in xn.SelectNodes("properties"))
{
arrd.Add(checkNullValue(child["value"]));
}
arrd2.AddRange(arrd);
//For Converting to JSON
try
{
var jobVals = getXmlData("test", "testuser2", "654321", "Sources/soapRequest.xml");
Response.Write(jobVals.Count);
//JSONIZE list(the XML)
string json = JsonConvert.SerializeObject(jobVals);
Response.Write(json);
}
catch (Exception ex)
{
Response.Write(ex);
}
请帮助。
答案 0 :(得分:4)
使用Linq到XML
XDocument xml = //...
var result = xml.Elements("job")
.Select(job => job
.Elements("properties")
.ToDictionary(p => p.Element("name").Value, p => p.Element("value").Value)
);
result
将包含一系列字典,当序列化时,
string json = JsonConvert.SerializeObject(result);
使用Json.Net之类的东西,将产生所需的结果。
上面的示例不包含任何验证检查,但是可以轻松添加。该示例只是为了说明如何将数据转换为所需的模型。
答案 1 :(得分:0)
您提供的JSON无效。您可以在哪里使用newtonsoft
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string json = JsonConvert.SerializeXmlNode(doc);
答案 2 :(得分:0)
在XSLT中非常简单:
<xsl:template match="/">[<xsl:apply-templates/>]</xsl:template>
<xsl:template match="job">{<xsl:apply-templates/>}</xsl:template>
<xsl:template match="properties">"<xsl:value-of select="name"/>":"<xsl:value-of select="value"/>"</xsl:template>