изменение существующего пролога XML с помощью JavaScript

1

Я видел вопросы/ответы для Java и С#, но не для JavaScript.

Если у меня есть XML doc/string со стандартным прологом, как он будет доступен?

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

Поскольку пролог сам по себе не имеет имени элемента, он, насколько мне известно, не может быть xml.getElementByTagName() на xml.getElementByTagName(), поэтому делает невозможным удаление любого атрибута пролога.

Например, если бы у меня был XML, который бы выглядел так:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <element>text</element>
</root>

Я мог бы нацелить <element> и добавлять атрибуты, удалять текст и т.д. Но, допустим, я хотел изменить или удалить отдельную декларацию. Я бы не смог настроить его обычными методами.

Итак, как можно прологи изменить с помощью JavaScript?

  • 1
    Вопросы призваны предоставить минимально полный и проверяемый пример , попробуйте улучшить свой.
  • 0
    @ LuisMuñoz Я сделал несколько дополнений. Это работает?
Показать ещё 1 комментарий
Теги:

2 ответа

2

Это работало с консоли Firefox dev tools:

// build an xml
var xmlDoc = document.implementation.createDocument(null, "books");
// print XML string
(new XMLSerializer()).serializeToString(xmlDoc);  

Просто корневой узел

"<books/>"

Теперь создайте документ с вашим требованием

var parser = new DOMParser();
prolog = '<?xml version="1.0" encoding="utf-8" standalone="no"?>';
// Add existing XML starting at root element
newXmlStr = prolog + (new XMLSerializer()).serializeToString(xmlDoc);
var xml  = parser.parseFromString(newXmlStr, "application/xml");
// print raw xml
console.log((new XMLSerializer()).serializeToString(xml));

Новая строка XML:

"<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<books/>"

Другие случаи:

prolog = '<?xml version="1.0" encoding="utf-8"?>';

prolog = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>';

Если ваш xml уже содержит пролог, запустите его с корневого элемента с помощью xml.documentElement

prolog = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>';
var parser = new DOMParser();
XmlStr = prolog + "<bookz/>";
var xmlz  = parser.parseFromString(XmlStr, "application/xml");
console.log((new XMLSerializer()).serializeToString(xmlz));

XML с standalone="yes"

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<bookz/>

Новый XML:

// set standalone="no"
prolog = '<?xml version="1.0" encoding="utf-8" standalone="no"?>';
// serialize existing xml at root node
newXmlStr = prolog + (new XMLSerializer()).serializeToString(xmlz.documentElement);
// Rebuild with new prolog
var xml  = parser.parseFromString(newXmlStr, "application/xml");

XML с standalone="no"

console.log((new XMLSerializer()).serializeToString(xml));
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bookz/> 
  • 0
    Что если документ XML, пролог которого вы пытаетесь изменить, уже имеет пролог и не начинается с корневого элемента, что ограничивает возможность объединения нового пролога?
  • 0
    Добавлен пример для этого случая.
0

Другое возможное решение состоит в том, чтобы просто удалить неблагоприятный пролог и заменить его на благоприятный пролог с помощью str.replace().

Если неблагоприятный пролог выглядит следующим образом:

var badProlog = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'

И благоприятный пролог выглядит следующим образом:

var goodProlog = '<?xml version="1.0" encoding="UTF-8"?>'

Используйте следующий метод для замены пролога:

xmlStr.replace(badProlog, goodProlog)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню