-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 に答える