2013-11-20 52 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。

不利之處是你必須編寫代表所有數據的類,但這可能是一個隱藏的獎勵,因爲這些類在將來肯定會派上用場。畢竟 - 它們確實代表您的應用程序中使用的數據結構...