Я видел вопросы/ответы для 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?
Это работало с консоли 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/>
Другое возможное решение состоит в том, чтобы просто удалить неблагоприятный пролог и заменить его на благоприятный пролог с помощью 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)