使用perl进行XML到JSON的转换

时间:2015-02-10 22:32:40

标签: regex xml json perl xml-parsing

我使用perl转换XML文件JSON。我能够编写用于将输入XML文件转换为Json格式的代码。

以下是示例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>

示例执行json转换的perl代码:

#!/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转换,即检查XML中的元素“FileName”是否为空。如果它也没有提取它的价值。

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中存在这样的东西。

2 个答案:

答案 0 :(得分:1)

正如XML::Simple文档所指出的那样,它会悄悄地淹没&#39;将XML转换为类似于输入XML的数据结构。因此,要弄清楚XML的内容,只需将其视为可能的哈希引用:

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

答案 1 :(得分:1)

您应该使用XML::LibXML而不是XML :: Simple。然后使用xpath查询每个文档。我要看一下XML::XML2JSON的代码,看看它是否适合这个问题......