Как обрабатывать недопустимые символы в значении «NAME» атрибутов XML

#xml

#xml

Вопрос:

Допустим, у меня есть фрагмент XML, который выглядит следующим образом:

 <row Johnsonamp;amp;Johnson="good" Mamp;amp;Ms ="bad" /> --self closing tag
  

или

 <row Johnsonamp;amp;Johnson="good" Mamp;amp;Ms ="bad" </row>
  

Я избежал символа amp; в значении имени атрибута, но, похоже, это все еще незаконно. Могут ли у вас быть значения ИМЕН атрибутов с экранированными недопустимыми символами? Если да, то как?

Комментарии:

1. Это не часть XML. Таким образом, вы не можете использовать какую-либо технологию, предназначенную для обработки XML; вам нужно будет использовать необработанную обработку текста, чтобы преобразовать этот материал в XML, прежде чем вы сможете сделать с ним что-либо полезное. Однако, вместо восстановления данных, более важно восстановить процесс, который их генерирует.

Ответ №1:

amp;, 0x26, не допускается в именах XML:

Раздел 2.3, «Распространенные синтаксические конструкции»

 [4]NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
[4a]NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
  

Ответ №2:

Нет, вы не можете использовать амперсанд в имени любого вида. В результате у вас вообще нет XML. Вы только что получили некоторый текст, который не соответствует правильно сформированному XML.

Рассмотрите возможность использования чего-то более похожего на следующее в качестве альтернативы:

 <products>
    <product name="Johnsonamp;amp;Johnson" quality="good"/>
    <product name="Mamp;amp;Ms" quality="bad" />
</products>
  

Комментарии:

1. Вы не ответили на мой вопрос? Можете ли вы иметь имена атрибутов с недопустимыми символами или нет? Все, что вы сделали, это изменили мой пример xml, если я уберу eh amp; amp; это было бы полностью корректно, так к чему вы клоните

2. @Mike: извините, думал, я ясно выразился. Нет, у вас не может быть амперсандов в имени любого вида. XML, который я опубликовал, был примером законного способа хранения одних и тех же данных.