2016-07-13 5 views
1

следующий код:Python ElementTree не любит двоеточие имя инструкции обработки

import xml.etree.ElementTree as ET 

xml = '''\ 
<?xml version="1.0" encoding="UTF-8"?> 
<testCaseConfig> 
    <?LazyComment Blah de blah/?> 
    <testCase runLimit="420" name="d1/n1"/> 
    <testCase runLimit="420" name="d1/n2"/> 
</testCaseConfig>''' 

root = ET.fromstring(xml) 

xml2 = xml.replace('LazyComment ', 'LazyComment:') 
print(xml2) 
try: 
    root2 = ET.fromstring(xml2) 
except ET.ParseError: 
    print("\nERROR in xml2!!!\n") 

xml3 = xml2.replace('testCaseConfig', 'testCaseConfig xmlns:Blah="http://www.w3.org/TR/html4/"', 1) 
print(xml3) 
try: 
    root3 = ET.fromstring(xml3) 
except ET.ParseError: 
    print("\nERROR in xml3!!!\n") 
    raise 

дает этот выход:

<?xml version="1.0" encoding="UTF-8"?> 
<testCaseConfig> 
    <?LazyComment:Blah de blah/?> 
    <testCase runLimit="420" name="d1/n1"/> 
    <testCase runLimit="420" name="d1/n2"/> 
</testCaseConfig> 

ERROR in xml2!!! 

<?xml version="1.0" encoding="UTF-8"?> 
<testCaseConfig xmlns:Blah="http://www.w3.org/TR/html4/"> 
    <?LazyComment:Blah de blah/?> 
    <testCase runLimit="420" name="d1/n1"/> 
    <testCase runLimit="420" name="d1/n2"/> 
</testCaseConfig> 

ERROR in xml3!!! 

Traceback (most recent call last): 
    File "C:\Users\Paddy3118\Google Drive\Code\elementtree_error.py", line 30, in <module> 
    root3 = ET.fromstring(xml3) 
    File "C:\Anaconda3\envs\Py3.5\lib\xml\etree\ElementTree.py", line 1333, in XML 
    parser.feed(text) 
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 3, column 17 

Я искал и нашел this Q, которая указала на другие ресурсы, которые я прочитал.

Кажется, что '?' делает его обработкой, чье имя тега может включать двоеточия. Без '?' то двоеточие в имени указывает пространство имен, и один из ответов указывает, что определение пространства имен должно заставить все работать.

Объединение '?' и ':', но вызывает проблемы с ElementTree.

Мне даны xml-файлы этого типа, которые используются другими инструментами, которые анализируют его в порядке и хотят сами обрабатывать файлы с помощью Python. Есть идеи?

Спасибо.

ответ

1

Согласно W3C Extensible Markup Language 1.0 Спецификации под Common Syntactic Constructs:

В Namespaces в Рекомендации XML [XML Names ] присваивает значение именам, содержащим символы двоеточия. Поэтому авторы не должны использовать двоеточие в именах XML, кроме целей пространства имен, но процессоры XML должны принимать двоеточие в качестве символа имени.

И далее в W3C XPath 1.0 примечания на Processing Instruction nodes:

Инструкция обработки имеет расширенное имя: локальная часть Объект инструкции процессинговый в; URI пространства имен имеет значение NULL.

В целом, <?LazyComment:Blah de blah/?> является недопустимой инструкции по обработке, как колоны используется для ссылки пространства имен URI, и для обработки команд, что часть является нулевым или пустым. Следовательно, процессор XML Python жалуется, что использование такой команды не отображает хорошо сформированный XML.

Кроме того, пересмотреть такие инструменты, которые генерируют такие недействительные инструкции по обработке, поскольку они не обрабатывают действительные документы XML. Возможно, такие инструменты обрабатывают XML-файлы как текстовые документы (аналогично тому, как вы могли заменить строковое представление XML, но не смогли бы добавить команду с использованием etree).

+0

Ах! Спасибо, я пропустил заметку XPath при поиске w3C.Файлы редактируются вручную, но читаются некоторыми библиотеками синтаксического анализа XML C++, которые, похоже, принимают эту ошибку. Я уже добавил предварительный фильтр xml к моему скрипту, где я заменяю это событие пробелом, и все хорошо. Я просто хотел узнать, отклонил ли Elementtree действительный xml, что означало бы оповещение его сопровождающих. Еще раз спасибо. – Paddy3118

0
<?xml version="1.0" encoding="UTF-8"?> 
<testCaseConfig xmlns:Blah="http://www.w3.org/TR/html4/"> 
    <?LazyComment:Blah de blah/?> 
    <testCase runLimit="420" name="d1/n1"/> 
    <testCase runLimit="420" name="d1/n2"/> 
</testCaseConfig xmlns:Blah="http://www.w3.org/TR/html4/"> 

Недопустимый XML. Вы не можете иметь атрибуты в закрывающем теге. Последняя строка должна быть только </testCaseConfig>

Также комментарии написаны как этот

<!-- this is a comment --> 
+0

Спасибо за это. Это не является особенностью моей проблемы, поэтому я отредактировал свой вопрос, чтобы сделать вставку xmlns только один раз. – Paddy3118

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

  • Нет связанных вопросов^_^