2012-02-16 2 views
1

У меня есть довольно простой бит JavaScript, что пытаться разобрать XML-я извлеченный из метаданных в формате JPEG:Почему функция parseXML jquery не работает, когда XML выглядит нормально?

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); 
} 

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

+1

Обратите внимание, что сам jQuery не анализирует XML вообще - браузер делает это. – Pointy

+0

@Pointy, хорошая точка. Это произошло в Chrome. Я пробовал в FireFox, и он разбирается нормально. Теперь, что я могу сделать? !! Arg! –

ответ

4

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

я был в состоянии удалить его с этим грязным битом взлома:

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

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

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

+0

Будет ли этот символ бинарным? Просто потому, что вы этого не видите, это не значит, что его нет, но обрезать его таким образом гарантировано, что вы не включаете его в переменную. Неплохо. –

+0

Действительно. Мое беспокойство заключается в том, что после окончательного «>» не должно было быть никаких данных. Если случайно произошло что-то случайное «>», мой хак не будет работать, и я снова получу эту проблему. Но каковы шансы? ;) –

+0

как вы извлекли метаданные из jpg?Я более бессовестно интересуюсь этой частью :) –

0

Используя этот сайт http://www.xmlvalidation.com, я получил следующее сообщение об ошибке, убедитесь, что вы установите флажок «Validate от внешней схемы 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> 
+0

Я не думаю, что это проблема. Никакая внешняя схема не определена, поэтому я не знаю, с чем этот сайт проверяется. У меня также есть другие примеры, которые не терпят неудачу в parseXML в Chrome, но вызывают такую ​​же ошибку на этом веб-сайте. –

0

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

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

header ("Content-Type: text/xml"); 
+0

Входные данные xml были фактически просто строкой, которую я вручную вырвал из двоичного jpeg-файла в javascript. В конце концов я решил свою проблему (см. Мой ответ), но спасибо за предложение. –

Смежные вопросы