2013-11-20 61 views
0

我在C#下面的XML像这样的标记:选择使用JSON.NET和LINQ

string xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + 
     "<!--PowerStats Table Model Paramter Template Ver 1.0 Created on 11/19/2013-->" + 
     "<paramFile version=\"1.0\" createdBy=\"PowerStats v1.0\">" + 
     " <DSNumber value=\"82\" />" + 
     "</parmFile>" + 
     "<paramFile version=\"2.0\" createdBy=\"PowerStats v2.0\">" + 
     " <DSNumber value=\"83\" />" + 
     "</parmFile>"; 

然后,我创建了JSON测试(这)是行之有效的:

XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(xml); 
    string jsonText = JsonConvert.SerializeXmlNode(doc).Replace("\"@", "\""); 

但使用JToken,我如何获得第一个paramFile版本和第二个代码如下?我一直得到空。

JToken token = JObject.Parse(jsonText); 

    string paramFile = (string)token.SelectToken("paramFile[0].version"); 

    Response.Write(paramFile); 
+1

我很惊讶,不会抛出异常,因为您没有XML中的单个根元素。你有没有尝试打印'jsonText'来查看它的结构? –

+0

你说得对。如果有2个paramFile和一个根,我需要弄清楚有多少个paramFile可以做root.paramFile.version或者root.paramFile [0] .version – cdub

+0

你有使用Json.NET来解析XML的原因吗?为什么不能直接从XML DOM获取数据? –

回答

0

就像我们想通了评论,因为你没有一个根元素SerializeXmlNode只需要第一个元素,因此不会创建一个数组。

如果您可以修改XML,您可以add an attribute that tells SerializeXmlNode to always convert paramFiles to array - even if there is only one

如果你的主要目标是将大量的XML转换为JSON,我会建议一种不同的方法。

XML无法正确自动转换为JSON,因为XML和JSON的结构本质上不同。 the result JSON will look weird或者你的情况都不会总是正确的。

好的一面是,如果有架构,XML可以转换为JSON。我不是在谈论XmlSchema或JsonSchema(尽管你可能会发现一个使用这些工具进行转换的工具) - 我正在讨论如何构建XML/JSON所表示的数据的任何定义。如果您有一个将模式考虑在内的转换,则可以进行正确的自动转换。

现在,您可以根据使用模式最容易的事是C#类:

  1. 创建一个类结构,表示要转换的数据。

  2. 使用XmlSerializer.Deserialize将XML转换为对象。使用JToken.FromObject将对象转换为JSON。

不利之处是你必须编写代表所有数据的类,但这可能是一个隐藏的奖励,因为这些类在将来肯定会派上用场。毕竟 - 它们确实代表您的应用程序中使用的数据结构...