通过bash将XML提取到json

时间:2018-07-18 14:33:17

标签: json xml bash sed

我正在尝试在XML标记中找到一些特定信息,并将其转换为json字符串。我想出了最复杂的解决方案,但是它几乎可行。我只需要删除空格和换行符。但是我尝试过,即使是我的价值观也可以一起运行。

样本数据:

<config>
  <derivedFrom>
    <courseName>Family and Medical Leave</courseName>
    <courseCode>FML</courseCode>
    <courseAuthor>Company 1</courseAuthor>
    <courseVersion>2.0.0</courseVersion>
    <importLocale>en-US</importLocale>
  </derivedFrom>
</config>

这是我正在使用的sed代码:

sed -n '
    /<derivedFrom>/ {
    :a;
    N;
    /<\/derivedFrom>/!ba;
    s/.*<derivedFrom>//;
    s/<\/derivedFrom>//;
    s/<\/[a-zA-Z]*>/",/g;
    s/</"/g;
    s/>/":"/g;
    s/[[:space:]]//g;
    s/,$//g;
    p
    }'

最后,这是我当前的输出是"courseName":"FamilyandMedicalLeave","courseCode":"UBM2C","courseAuthor":"Alchemy","courseVersion":"2.0.021","importLocale":"en-US"

我知道我需要用其他内容代替[[:space:]],因为我不希望引号中的文本一起出现,但是我被卡住了。例如:家庭和病假应保留其空间。使用一些XML到JSON脚本可能还有一种更简单的方法。但是,我需要这样做,而无需在服务器上安装其他任何东西。

2 个答案:

答案 0 :(得分:2)

注意:我不知道有关xml和json的所有详细信息。如您指定的那样,您无法安装程序,使用sedpaste的一些步骤可能会为您提供帮助。这仅供参考,可能并不能完全满足您的要求,并且假定数据格式如示例中所示

第1步:获取必要的行(有关详细信息,请参见How to select lines between two patterns?

$ sed -n '/<derivedFrom>/, /<\/derivedFrom>/{//!p}' ip.txt
    <courseName>Family and Medical Leave</courseName>
    <courseCode>FML</courseCode>
    <courseAuthor>Company 1</courseAuthor>
    <courseVersion>2.0.0</courseVersion>
    <importLocale>en-US</importLocale>

步骤2 :重新设置过滤后的行的格式
也可以与上一步合并为//!s|.*<\([^>]*\)>\(.*\)</\1>.*|"\1":"\2"|p

sed 's|.*<\([^>]*\)>\(.*\)</\1>.*|"\1":"\2"|'
"courseName":"Family and Medical Leave"
"courseCode":"FML"
"courseAuthor":"Company 1"
"courseVersion":"2.0.0"
"importLocale":"en-US"

第3步:使用粘贴将其加入

paste -sd,
"courseName":"Family and Medical Leave","courseCode":"FML","courseAuthor":"Company 1","courseVersion":"2.0.0","importLocale":"en-US"

答案 1 :(得分:0)

为什么不简单?对Bash有效

sed -n '
    /<derivedFrom>/ {
    :a;
    N;
    /<\/derivedFrom>/!ba;
    s/.*<derivedFrom>//;
    s/<\/derivedFrom>//;
    s/<\/[a-zA-Z]*>/",/g;
    s/</"/g;
    s/>/":"/g;
    s/,$//g;
    p
    }' input.txt | sed 's/^ *//g;s/ *$//g'

致谢!