-1

请不要评论说您无法使用正则表达式解析 XML,它可以做到,但这不是最好的方法。请不要无缘无故否定这个问题。

在 Parse.com 的云代码上,您目前无法在没有大量编码工作的情况下将 XML 转换为 json。我在以下位置找到了以下代码:http: //killzonekid.com/worlds-smallest-fastest-xml-to-json-javascript-converter/

xml = xml.replace(/\s/g, ' ').replace(/< *\?[^>]*?\? *>/g, '').replace(/< *!--[^>]*?-- *>/g, '').replace(/< *(\/?) *(\w+\b):(\w+\b)/g, '<$1$2_$3').replace(/< *(\w+\b)([^>]*?)\/ *>/g, '< $1$2>').replace(/(\w+\b):(\w+\b) *= *"([^>]*?)"/g, '$1_$2="$3"').replace(/< *(\w+\b)((?: *\w+ *= *" *[^"]*?")+ *)>( *[^< ]*?\b.*?)< *\/ *\1 *>/g, '< $1$2 value="$3">').replace(/ *(\w+\b) *= *"([^>]*?)" */g, '< $1>$2').replace(/< *(\w+\b) *</g, '<$1>< ').replace(/> *>/g, '>').replace(/< *\/ *(\w+\b) *> *< *\1 *>/g, '').replace(/"/g, '\\"').replace(/< *(\w+\b) *>([^<>]*?)< *\/ *\1 *>/g, '"$1":"$2",').replace(/< *(\w+\b) *>([^<>]*?)< *\/ *\1 *>/g, '"$1":{$2},').replace(/< *(\w+\b) *>(?=.*?< \/\1\},\{)/g, '"$1":[{').split(/\},\{/).reverse().join('},{').replace(/< *\/ *(\w+\b) *>(?=.*?"\1":\[\{)/g, '}],').split(/\},\{/).reverse().join('},{').replace(/< \/(\w+\b)\},\{\1>/g, '},{').replace(/< *(\w+\b)[^>]*?>/g, '"$1":{').replace(/< *\/ *\w+ *>/g,'},').replace(/\} *,(?= *(\}|\]))/g, '}').replace(/] *,(?= *(\}|\]))/g, ']').replace(/" *,(?= *(\}|\]))/g, '"').replace(/ *, *$/g, '');

它实际上在将 XML 转换为 json 方面做得很好。

代码有一些怪癖。1.它弄乱了属性。

  1. 它不喜欢带有连字符的名称。为了修复连字符,我将所有 \w+ 更改为 \w[\w'-] 这是最好的方法吗?

这是一个示例 XML 文档

    <?xml version="1.0" encoding="UTF-8" ?>
<api>
    <products total-matched="1618" records-returned="1" page-number="1">
        <product>
            <ad-id>1234</ad-id>
            <supplier-name>Window World</supplier-name>
            <supplier-category>3703703</supplier-category>
            <buy-url>http://website.com</buy-url>
            <currency>USD</currency>
            <description>Window</description>
            <image-url>http://website.com/windowa/80x80.jpg</image-url>
            <in-stock>yes</in-stock>
            <manufacturer-name>Window World</manufacturer-name>
            <name>Half Pain Glass</name>
            <price>31.95</price>
            <retail-price>87.60</retail-price>
            <sale-price>29.95</sale-price>
            <sku>5938</sku>
            <upc></upc>
        </product>
    </products>
</api>

示例输出:

{
    "api": {
        "products": {
            "total-matched": {
                1618 "records-returned": {
                    1 "page-number": {
                        1 >
                            "product": {
                            "adid": "1234",
                            "suppliername": "Window World",
                            "suppliercategory": "3703703",
                            "buyurl": "http://website.com",
                            "currency": "USD",
                            "description": "Window",
                            "imageurl": "http://website.com/windowa/80x80.jpg",
                            "instock": "yes",
                            "manufacturername": "Window World",
                            "name": "Half Pain Glass",
                            "price": "31.95",
                            "retailprice": "87.60",
                            "saleprice": "29.95",
                            "sku": "5938",
                            "upc": ""
                        }
                    }
                }
            }
        }
    }
}
4

1 回答 1

1

我的猜测是 - 查看生成的 json 的结构 - 应该没有属性。要授权它们,您需要更改很多东西,包括嵌套嵌套的 json ......
难道不能只更改:

<products total-matched="1618" records-returned="1" page-number="1">

<products>
  <total-matched>1618</total-matched>
  <records-returned>1</records-returned>
  <page-number>1</page-number>
  <product>...

...因为它会给你你期望的属性(我猜)。

至于连字符,你的想法很好,只需将 \w 更改为 [\w-],它应该可以工作(我很高兴承认我没有研究所有的正则表达式,所以这只是一个猜测)。\w+ 会变成 [\w-]+ 等等。

编辑:

您可以添加一个步骤来首先更改您的 xml。这个正则表达式应该做那部分:

/(<\w+[^<]*?)\s+([\w-]+)="([^"]+)">/
// asuming there is no " in your attributes' values (would be more complicated...)

测试:

var string = '<api><products total-matched="1618" records-returned="1" page-number="1">';
var regex = /(<\w+[^<]*?)\s+([\w-]+)="([^"]+)">/;
while(string.match(regex)) string = string.replace(regex, '$1><$2>$3</$2>');

结果:

"<api><products><total-matched>1618</total-matched><records-returned>1</records-returned><page-number>1</page-number>"
于 2013-03-27T10:42:52.077 回答