Почему функция parseXML в jquery не работает, когда XML выглядит нормально? - PullRequest
1 голос
/ 16 февраля 2012

У меня есть довольно простой фрагмент javascript, который пытается проанализировать xml, извлеченный из метаданных в формате jpeg:

var xmlDoc;
try {
    xmlDoc = $.parseXML(xmlString);
} catch(e) {
    console.log(e);
}

Вот исключение, которое выдается:

Invalid XML: <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 4.4.0">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
         <photoshop:Instructions>C1DDZVs9Sr+DG5R9eSc%9w</photoshop:Instructions>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:aux="http://ns.adobe.com/exif/1.0/aux/">
         <aux:SerialNumber>1</aux:SerialNumber>
         <aux:Lens>AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED [II]</aux:Lens>
         <aux:LensID>1</aux:LensID>
         <aux:ImageNumber>6651</aux:ImageNumber>
         <aux:FlashCompensation>0/1</aux:FlashCompensation>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>

В этом XML нет ничего плохого.На самом деле, если я вырезал и вставлял этот xml напрямую, исключение не выдается:

var xmlDoc;
try {
    xmlDoc = $.parseXML('<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 4.4.0">       <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">          <rdf:Description rdf:about=""                xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">             <photoshop:Instructions>C1DDZVs9Sr+DG5R9eSc%9w</photoshop:Instructions>          </rdf:Description>          <rdf:Description rdf:about=""                xmlns:aux="http://ns.adobe.com/exif/1.0/aux/">             <aux:SerialNumber>1</aux:SerialNumber>             <aux:Lens>AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED [II]</aux:Lens>             <aux:LensID>1</aux:LensID>             <aux:ImageNumber>6651</aux:ImageNumber>             <aux:FlashCompensation>0/1</aux:FlashCompensation>          </rdf:Description>       </rdf:RDF>    </x:xmpmeta>' );
} catch(e) {
    console.log("error parsing xml: " + e);
}

Я могу только предположить, что там где-то должен быть какой-то непечатаемый специальный символ, который вызывает проблему.Как я могу проверить это предположение и исправить его, или, возможно, что-то еще не так?

Ответы [ 3 ]

5 голосов
/ 16 февраля 2012

Я нашел проблему.Как я и подозревал, в конце строки скрывался какой-то неприятный непечатаемый символ.

Я смог удалить его с помощью этого грязного взлома:

xmlString = xmlString.substr(xmlString.indexOf("<"), xmlString.lastIndexOf(">") + 1);

Если это не очевидно, он просто удаляет из начала и конца строки все, что не является ожидаемыми угловыми скобками документа xml.Функция jQuery «trim ()» была неэффективна при удалении мошеннического символа, так как она работает только с пробелами.

Я не знаю, что это был за символ, и я не особенно доволен своим решением, ноЯ слишком занят, чтобы тратить на это больше времени.Вздох.

0 голосов
/ 16 февраля 2012

Возможно ваша проблема:
вы не можете использовать функции XML (в JS) для файла, который не имеет заголовка XML.
попытаться открыть файл / ввод XML в браузере(введите путь в адресной строке),
и посмотрите, открыт ли он как XML-файл или как текстовый файл.

для emample, добавление заголовка XML с php:

header ("Content-Type: text/xml");
0 голосов
/ 16 февраля 2012

Используя этот веб-сайт http://www.xmlvalidation.com, Я получил следующее сообщение об ошибке, убедитесь, что вы отметили флажок "Проверка по внешней XML-схеме"

An error has been found! 

1:  62  cvc-elt.1: Cannot find the declaration of element 'x:xmpmeta'.

XML document: 
1   <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 4.4.0">
2      <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
3         <rdf:Description rdf:about=""
4               xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
5            <photoshop:Instructions>C1DDZVs9Sr+DG5R9eSc%9w</photoshop:Instructions>
6         </rdf:Description>
7         <rdf:Description rdf:about=""
8               xmlns:aux="http://ns.adobe.com/exif/1.0/aux/">
9            <aux:SerialNumber>1</aux:SerialNumber>
10           <aux:Lens>AF-S DX VR Zoom-Nikkor 18-200mm f/3.5-5.6G IF-ED [II]</aux:Lens>
11           <aux:LensID>1</aux:LensID>
12           <aux:ImageNumber>6651</aux:ImageNumber>
13           <aux:FlashCompensation>0/1</aux:FlashCompensation>
14        </rdf:Description>
15     </rdf:RDF>
16  </x:xmpmeta>
...