2015-02-10 2 views
1

Я использую perl для преобразования XML-файла JSON. Мне удалось написать код для преобразования входного XML-файла в формат Json.Преобразование XML в JSON с использованием perl

Вот пример XML:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
    <Person SchemaVersion="1.0.8"> 
     <ID>0</ID> 

     <Home ID="ABC-XYZ" State="Unknown"> 
     <Location> 
      <SiteName></SiteName> 
      <Number>62</Number> 
      <MaxSize>0</MaxSize> 
      <Comment></Comment> 
     </Location> 

     <Laptop> 
      <FileName>/usr/temp/RPM_020515_.tar.gz</FileName> 
     </Laptop> 
    </Home> 
    </Person> 

пример кода Perl делает преобразование JSON:

#!/usr/bin/perl 

use JSON; 
use XML::Simple; 

# Create the object of XML Simple 
my $xmlSimple = new XML::Simple(KeepRoot => 1); 

# Load the xml file in object 
my $dataXML = $xmlSimple->XMLin("input/path/to/above/XMLFILE"); 

# use encode json function to convert xml object in json. 
my $jsonString = encode_json($dataXML); 

# finally print json 
print $jsonString; 

Выходное значение JSON:

{ 
    "Person": { 
     "ID": "0", 
     "SchemaVersion": "1.0.8", 
     "Home": { 
      "ID": "ABC-XYZ", 

      "Laptop": { 
      "FileName": "/usr/temp/RPM_020515_.tar.gz" 
      }, 

      "Location": { 
       "Number": "62", 
       "MaxSize": "0", 
       "Comment": { }, 
       "SiteName": { } 
      }, 

      "State": "Unknown" 
     } 
    } 
} 

Приведенный выше код работает отлично.

Мой вопрос в том, что я фактически застрял.

Мне нужно сделать еще одну вещь вместе с конверсией JSON, которая проверяет, является ли элемент «FileName» в XML пустым или нет. если он не извлекает ее значение.

So output will be two things: 
1. XML To JSON convert (working fine) 
2. Along with point 1. extract the value of nested element in XML   
    "FileName". I need that for some business logic need in next step. 

Может ли кто-нибудь из экспертов по perl помочь мне здесь и предложить мне, как я могу это сделать в своем текущем Perl-коде.

Спасибо за помощь заранее. Это мой первый скрипт perl, поэтому, пожалуйста, извините меня, если это слишком тривиальный вопрос.

Пробовал читать документы perl, но не так полезен.

ПРИМЕЧАНИЕ. Я пытаюсь использовать только встроенные библиотеки perl, а не какие-либо новые сторонние библиотеки, поэтому я использовал XML :: Simple. Ограничение его производственного кода (очень плохая оценка). Я надеюсь, что что-то для этого существует в XML :: Simple или JSON.

+0

Возможно, вам понравится [эта статья] (http://www.perlmonks.org/index.pl ? node_id = 218480) при использовании XML :: Simple. Одна вещь, которая беспокоит меня о вашем коде, есть ли какие-либо элементы XML, которые можно было бы повторить? Например, может ли '' содержать более одного ''? –

+2

Не используйте XML :: Simple. Это не так. Это простой XML. Вместо этого попробуйте что-то вроде XML :: Twig. – Sobrique

+1

Re. * «Я пытаюсь использовать только встроенные библиотеки perl, а не какие-либо новые сторонние библиотеки, поэтому я использовал XML :: Simple.» * «XML :: Simple» не является основным модулем ... что еще неядерное модули ли ваша компания считает приемлемой? – ThisSuitIsBlackNot

ответ

1

Как отмечает XML::Simple, он «разрывает» XML в структуру данных, аналогичную входному XML. Таким образом, чтобы выяснить содержимое XML, рассматривать его в качестве эталона хэш это, вероятно, является:

if ($dataXML->{Person}{Home}{ID} eq 'foo') { 
    # Some action 
    ... 
} 
+0

Да, это должно работать, но только для тех XML, когда путь к элементу «FileName» всегда одинаковый, но если путь изменяется, тогда это не даст требуемого значения. Можете ли вы предложить что-то, что не жестко закодировано? – user1188611

+0

Вам придется пройти структуру данных, но я бы предложил Data :: Diver или получить XML-библиотеку на месте, которая поддерживает xpath - http://stackoverflow.com/questions/3700069/how-can-i- check-if-a-key-exists-in-a-deep-perl-hash – Oesor

+0

Я не могу воспроизвести то, как вы упомянули, можете ли вы привести пример? – user1188611

1

Вы должны использовать XML::LibXML вместо XML :: Simple. Затем используйте xpath для запроса каждого документа. Я бы посмотрел код XML::XML2JSON, чтобы узнать, может ли это быть хорошо подходит для проблемы ...

+0

, так что вы хотите сказать, что если я использую XML :: Simple, я не смогу получить значение определенного элемента «FileName», и мне нужно перепроектировать мой оригинальный код Perl ... Изначально я начал с XML: XML2JSON, но не смог для генерации JSON в формате, который я показал выше ... – user1188611

+0

Итак, вы не только конвертируете из XML в JSON, но также переводите из одной структуры данных в другую. Я предполагаю, что у вас возникают проблемы с объединением дочерних элементов с атрибутами элементов. – lnrdo