Самозакрывающаяся проблема с тегами в xml - Cheerio - PullRequest
1 голос
/ 19 марта 2020

Моя проблема не заключается в сохранении пробела в теге XML close во время анализа cheerio.

const xmlstr = <plugin> <testId /> <classId /> <goalsone> <goals /> <info>new</info> </goalsone> </plugin>;

const $one = cheerio.load(xmlstr, { xmlMode: true });

console.log( $one.xml() );

возвращает

<plugin> <testId/> <classId/> <goalsone> <goals/> <info>new</info> </goalsone> </plugin>

здесь вывод выводится для <testId/> и <classId/> но начальное состояние было <testId /> с одним пробелом в конце тега закрытия, тот же случай с <classId />. Я хочу сохранить тег самозакрывающегося тега. Я не хочу менять текущий формат XML.

Ответы [ 2 ]

1 голос
/ 19 марта 2020

К сожалению, я думаю, вам придется раскошелиться cheerio и обновить его xml код. Похоже, у него нет никаких опций для этого, и постобработка результирующего XML в виде строки будет проблематичной c.

Похоже, static.js использует serialize, экспорт по умолчанию из dom-serializer. Глядя на это , вам просто нужно изменить то, что в настоящее время строка 144 с:

tag += '/>';

на

tag += ' />';

Вы можете добавьте опцию для этого и отправьте им запрос. : -)


Вы сказали, что некоторые из ваших тегов имеют пробел, а некоторые нет. Я думаю, что ваш лучший вариант в этом случае - сделать коммит, который рационализирует данные (позволяет им постоянно иметь пространство или не имеет пространства), не меняя ничего другого. Таким образом, у будущих коммитов нет проблемы несовместимых окончаний самозакрывающихся тегов. Если вы сделаете это, то, вероятно, лучше придерживаться сериализации по умолчанию cheerio.

0 голосов
/ 19 марта 2020

Если вы действительно хотите, чтобы синтаксический анализ XML с последующим его сериализацией генерировал именно тот лексический XML, с которого вы начали, единственный реальный способ добиться этого - всегда поддерживать ваш лексический XML в канонической форме - либо официальный стандарт «Canonical XML» (см. https://www.xml.com/pub/a/ws/2002/09/18/c14n.html), либо какое-либо другое каноническое представление ваших собственных разработок. К сожалению, вы, вероятно, обнаружите, что инструменты / библиотеки для этого в мире Javascript не так много, поэтому вам, возможно, придется разработать свой собственный.

Более подход ad-ho c будет просто попытаться избежать наиболее распространенных ошибок, гарантируя, что вы избегаете "причудливости" при сериализации. Например, избегайте одинарных кавычек вокруг атрибутов, избегайте разделов CDATA и избегайте ненужных пробелов в тегах.

...