2013-11-20 4 views
0

У меня есть следующий XML в C#, как так:Выбор маркера с помощью 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 paramFiles с корнем вокруг них. Мне нужно выяснить, сколько paramFiles существует для 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 в объекты.

  3. Используйте JToken.FromObject, чтобы конвертировать объекты в JSON.

Недостатком является то, что вы должны писать классы, которые представляют все данные, но это может быть скрытым бонусом, как эти классы, безусловно, пригодится довольно часто в будущем. В конце концов - они представляют собой структуры данных, используемые в вашем приложении ...

Смежные вопросы