Ruby:将XML转换为JSON,将Name的值作为键,将Contents的值作为值

时间:2017-09-06 11:09:07

标签: json ruby xml

我有一个以下格式的XML XML文件

<?xml version="1.0" encoding="UTF-8"?>
<resources>
  <!-- I AM A COMMENT -->

  <!-- General -->
  <string name="foo">foo</string>
  <string name="bar">bar</string>
 </resources>

我希望我的JSON输出看起来像这样:

 {
    "resources": {
        "foo": "foo",
        "bar": "bar"
    }
 }

也就是说,我希望节点名称的值为Keys,并且节点内容的值为JSON KV对中的值。

是否可以使用nokogiri属性?还是破解?

或者我必须事先对XML进行预处理吗?

1 个答案:

答案 0 :(得分:1)

您可以使用XSLT转换XML,然后使用nokogiri对其进行转换:

我使用的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="resources">
{
    "resources": {
        <xsl:for-each select="string">
            "<xsl:value-of select="./@name"/>":
            "<xsl:value-of select="."/>"
            <xsl:choose>
                <xsl:when test="position() != last()">,</xsl:when>
            </xsl:choose>
        </xsl:for-each>
    }
}
</xsl:template>
</xsl:stylesheet>

将XSLT应用于nokogiri:

require 'nokogiri'
document = Nokogiri::XML(File.read('input.xml'))
template = Nokogiri::XSLT(File.read('template.xslt'))
transformed_document = template.transform(document)