редактировать
Подобный метод защищен на http://www.jsonml.org/. Они ввели термин язык разметки json.
Вы можете выбрать любое отображение, которое вам нравится, но если вы отобразите
<el attr="value">
txt
</el>
до
{"el":{"attr":"value","content":"txt"}}
тогда как бы вы отобразили:
<el attr="value" content="txt1">txt2</el>
Я бы воспользовался тем фактом, что некоторые названия атрибутов запрещены.
{"el":{"attr":"value", "content":"txt1", "":["txt"]}
Или более убедительный пример:
<widget>
<debug>on</debug>
<window title="Sample Konfabulator Widget">
I just put some text here
<name>main_window</name>
<width>500</width>
<height>500</height>
</window>
<image src="Images/Sun.png" name="sun1">
<hOffset>250<unit>mm</unit></hOffset>
<vOffset>250</vOffset>
<alignment>center</alignment>
</image>
</widget>
может отображаться на:
{"widget":{"":[
{"debug":{"":["on"]}},
{"window":{"title":"Sample Konfabulator Widget", "": [
"I just put some text here",
{"name":{"":["main window"]}},
{"width":{"":["500"]}},
{"height":{"":["500"]}}
]},
{"image":{"src":"Images/Sun.png", "name":"sun1", "":[
{"hOffset":{"":["250",{"unit":{"":["mm"]}}]}},
{"vOffset":{"":["250"]}},
{"alignment":{"":["center"]}}
}
]}
Правила этого преобразования однозначны:
- элемент преобразуется в объект.
- Ключом объекта является имя элемента.
- Значением объекта является сам объект с:
- атрибут сопоставляется со свойством объекта. (Ключ / значение)
- содержимое объекта сопоставляется со специальным свойством.
- Имя специального свойства - пустая строка. Это никогда не может вступать в противоречие с именем атрибута xml.
- Значение специального свойства представляет собой массив.
- В массиве простой текст представляется в виде строки.
- В массиве элементы представлены в виде объектов, как описано выше.
Для безопасного пространства существует способ однозначно упростить упомянутое отображение:
{"widget":{"":[
{"debug":"on"},
{"window":{"title":"Sample Konfabulator Widget", "": [
"I just put some text here",
{"name":"main window"},
{"width":"500"},
{"height":"500"}
]},
{"image":{"src":"Images/Sun.png", "name":"sun1", "":[
{"hOffset":["250",{"unit":"mm"}]},
{"vOffset":"250"},
{"alignment":"center"}
}
]}
Если элемент не имеет каких-либо атрибутов, объект-значение (содержащий специальное отображение пустой строки в массив) заменяется непосредственно на массив. Так что вместо:
{ "hOffset": { "": [ "250", { "единица": { "": [ "мм"]}}]}}
вы получите
{"hOffset":["250",{"unit":["mm"]}]}
Если содержимое элемента представляет собой просто текст, массив, содержащий строковое значение, заменяется непосредственно строковым значением, поэтому вы получите:
* * {Тысячи семьдесят-одна "hOffset": [ "250", { "единица": "мм"}]} * ** 1073 тысячи семьдесят две *
Таким образом, всегда будет только один способ отобразить jml (язык разметки json) обратно в xml (или html)