【问题标题】:XML to JSON conversion using perl使用 perl 将 XML 转换为 JSON
【发布时间】:2015-04-11 03:55:24
【问题描述】:

我正在使用 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 中存在这方面的内容。

【问题讨论】:

  • 您可能想阅读this article 了解如何使用 XML::Simple。让我担心您的代码的一件事是是否有任何可以重复的 XML 元素?例如,&lt;Home&gt; 是否可以有多个 &lt;Laptop&gt;
  • 不要使用 XML::Simple。它不是。它适用于简单的 XML。改用 XML::Twig 之类的方法。
  • 回复。 “我试图只使用 perl 内置库而不是任何新的第三方库,这就是我使用 XML::Simple 的原因。” XML::Simple 不是核心模块......还有什么其他非- 贵公司认为可以接受的核心模块吗?
  • @GrantMcLean:是的,XML 可能有重复的元素,你认为代码无法处理这种情况吗?
  • 是的,您没有使用我链接的文章中推荐的 ForceArray 或 KeyAttr 选项,这意味着当元素重复时,数据结构的形状会发生显着变化。 Read the article :-)

标签: regex xml json perl xml-parsing


【解决方案1】:

正如XML::Simple 文档所指出的,它将 XML 'slurp' 成类似于输入 XML 的数据结构。因此,要弄清楚 XML 的内容,只需将其视为可能是的哈希引用:

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

【讨论】:

  • 是的,这应该有效,但仅适用于那些 XML,当元素“文件名”的路径始终相同但如果路径发生变化,则不会产生所需的值。你能推荐一些没有硬编码的东西吗?
  • 您必须了解数据结构,但我建议使用 Data::Diver,或者准备一个支持 xpath 的 XML 库 - stackoverflow.com/questions/3700069/…
  • 我无法重现你提到的方式你能举个例子吗?
【解决方案2】:

您应该使用XML::LibXML 而不是 XML::Simple。然后使用xpath查询每个文档。我会看一下XML::XML2JSON 的代码,看看它是否能很好地解决这个问题……

【讨论】:

  • 所以你的意思是说,如果我使用 XML::Simple,我将无法获得特定元素“FileName”的值,我需要重新设计我原来的 perl 代码......最初我从XML:XML2JSON 但无法以我上面显示的格式生成 JSON...
  • 因此,您不仅要从 XML 转换为 JSON,还要从一种数据结构转换为另一种数据结构。我猜你在将子元素与元素属性合并时遇到问题。
猜你喜欢
  • 2014-08-02
  • 2014-02-22
  • 2011-12-17
  • 2016-06-13
  • 2021-04-29
  • 2015-04-11
  • 2010-09-16
  • 2019-02-16
  • 2020-01-26
相关资源
最近更新 更多