Пытается разобрать XML в JSON с помощью xml2js, а затем вернуть JSON в XML с помощью xmlbuilder (обычно после изменения программного обеспечения программно).Разбирайте XML в JSON и обратно ... с xml2js и xmlbuilder?
I думаю, что два должны быть дополнениями, за это сообщение https://github.com/oozcitak/xmlbuilder-js/issues/69. Но я испытываю трудности, и мне должно быть, что я не получаю параметры конфигурации правильно.
Вот код, я бегу:
var xml = fs.readFileSync(__dirname + '/../xml/theme.xml', 'utf8');
xml2js.parseString(xml, { attrkey: '@', xmlns: true }, function(err, json) {
var xml2 = xmlbuilder.create(json,
{version: '1.0', encoding: 'UTF-8', standalone: true}
).end({pretty: true, standalone: true})
});
Вот первый бит исходного XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme">
<a:themeElements>
<a:clrScheme name="Office">
<a:dk1>
<a:sysClr val="windowText" lastClr="000000"/>
</a:dk1>
<a:lt1>
<a:sysClr val="window" lastClr="FFFFFF"/>
</a:lt1>
<a:dk2>
<a:srgbClr val="1F497D"/>
</a:dk2>
...
</a:themeElements>
</a:theme>
Здесь, S, как xml2js разбирает, что JSON, это выглядит правильно для меня :
{
"a:theme": {
"@": {
"xmlns:a": {
"name": "xmlns:a",
"value": "http://schemas.openxmlformats.org/drawingml/2006/main",
"prefix": "xmlns",
"local": "a",
"uri": "http://www.w3.org/2000/xmlns/"
},
"name": {
"name": "name",
"value": "Office Theme",
"prefix": "",
"local": "name",
"uri": ""
}
},
"@ns": {
"uri": "http://schemas.openxmlformats.org/drawingml/2006/main",
"local": "theme"
},
"a:themeElements": [
{
"@ns": {
"uri": "http://schemas.openxmlformats.org/drawingml/2006/main",
"local": "themeElements"
},
"a:clrScheme": [
{
"@": {
"name": {
"name": "name",
"value": "Office",
"prefix": "",
"local": "name",
"uri": ""
}
},
"@ns": {
"uri": "http://schemas.openxmlformats.org/drawingml/2006/main",
"local": "clrScheme"
},
...
Обратите внимание, что в приведенном выше JSON:
- атрибут (например,
name=
) превращаются в ключи внутри@
объекта и - значений атрибутов превращаются в объекты
Теперь вот как это выглядит, когда xmlbuilder превращает его обратно в XML:
<a:theme ="[object Object]" ns="[object Object]">
<a:themeElements ns="[object Object]">
<a:clrScheme ="[object Object]" ns="[object Object]">
<a:dk1 ns="[object Object]">
<a:sysClr ="[object Object]" ns="[object Object]"/>
</a:dk1>
<a:lt1 ns="[object Object]">
<a:sysClr ="[object Object]" ns="[object Object]"/>
</a:lt1>
...
</a:themeElements>
</a:theme>
Так есть две проблемы, с которыми сталкивается XML-конструктор: * он не распознает имена атрибутов в объекте @
и * он не распознает значение атрибута внутри объект атрибута
Взлом оказывается, что xmlbuilder хочет атрибуты имен структурированы как:
`{ "@name": "Office Theme"} `
, а не
`{ "@" : { "name" : { value: "Office Theme" }}}`
Должен ли я настроить xml2js по-разному, xmlbuilder по-разному, или есть другая пара библиотеки, которые могут анализировать XML -> JSON -> XML?
Есть ли конкретная причина для этого объезда в JSON и обратно? Изменение XML напрямую кажется более разумным, когда XML - это то, что вы хотите иметь в конце ... – Tomalak
Большой вопрос. В этом случае UI и DB работают с объектами JS/JSON, поэтому возможность представлять XML-контент (например, документ MS Office) в качестве JSON позволяет настраивать пользовательские конфигурации путем смешивания в объектах без явного пересечения DOM. Я надеялся, что задний конец будет таким же простым, как «xml2js.parseString (xml, function (err, json)» {_.mixin (json, edits); xmlbuilder.create (json) .end(); ' – prototype