2014-08-28 2 views
1

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

После кода, что я пробовал:

ET.register_namespace('', "http://oval.mitre.org/XMLSchema/oval-definitions-5") 
ET.register_namespace('', "http://oval.mitre.org/XMLSchema/oval-definitions-5#windows") 
ET.register_namespace('', "http://oval.mitre.org/XMLSchema/oval-definitions-5#independent") 

ns = "{http://oval.mitre.org/XMLSchema/oval-definitions-5}" 
f = open ("def_ex.xml","ra") 
tree = ET.parse(f) 
root = tree.getroot() 

for defn in root.iter('%stag' %ns): 
    if "patch" in defn.get("class"): #pick id attrib where class attrib is "patch" 
     print defn.get("id")  
     mirr_def = copy.deepcopy(defn) 
     defn.append(mirr_def) 
     tree.write("def_ex.xml") 
     exit() 

Но проблема third пространства имен перезапись one и two, как показано в следующем выходе коды:

<ns0:tag> 
....... 
....... 
</ns0:tag> 

<ns1:tag1> 
........ 
........ 
</ns1:tag1> 

<tag2> 
...... 
...... 
</tag2> 

Моего последний вопрос, как Прес rve все пространства имен, не переписывая друг друга, когда существуют разные «якорные метки» с тем же URI?

Обновлено: def_ex.xml

<oval_definitions xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oval="http://oval.mitre.org/XMLSchema/oval-common-5" xmlns:oval-def="http://oval.mitre.org/XMLSchema/oval-definitions-5" xmlns:windows-def="http://oval.mitre.org/XMLSchema/oval-definitions-5#windows" xmlns:independent-def="http://oval.mitre.org/XMLSchema/oval-definitions-5#independent" xsi:schemaLocation=" http://oval.mitre.org/XMLSchema/oval-definitions-5#windows windows-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#independent independent-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5 oval-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-common-5 oval-common-schema.xsd"> 
<tag id="oval:def:1" class="inventory"> 
........... 
........... 
........... 
</tag> 
<tag1 xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#windows" id="oval:tst:1" version="1"> 
............ 
............ 
</tag1> 
<tag2 xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#independent" id="oval:tst:2" version="1"> 
............ 
............ 
</tag2> 
</oval_definitions> 
+1

Непонятный вопрос. «Несколько пространств имен с одинаковым URI» звучат странно. Если URI один и тот же, пространство имен одинаковое. Также, пожалуйста, покажите нам содержимое def_ex.xml. – mzjn

+0

Да, тот же URI с разными тегами привязки, как показано в моем коде, и def_ex.xml - это огромный файл (более 2000 строк) – Naive

+1

Пожалуйста, покажите нам обрезанный образец входного XML и то, что вы хотите, чтобы результат выглядел. А что такое «якорный» тег? – mzjn

ответ

0

Вы используете один и тот же префикс для определения всех 3 URI. Как упоминалось в документах, реестр пространства имен является глобальным, и, следовательно, значения перезаписываются.

От docs:

xml.etree.ElementTree.register_namespace(prefix, uri)

Регистрирует префикс пространства имен. Реестр глобально, и любое существующее сопоставление либо для заданного префикса, либо для URI пространства имен будет удалено. prefix - префикс пространства имен. uri - это пространство имен uri. Теги и атрибуты в этом пространстве имен будут сериализованы с заданным префиксом, если это вообще возможно.

Я хотел бы предложить вам добавить пространства имен для каждого из адресов URI, как следует, и использовать их соответствующим образом

namespaces = {'ns1': 'http://oval.mitre.org/XMLSchema/oval-definitions-5', 
       'ns2': 'http://oval.mitre.org/XMLSchema/oval-definitions-5#windows', 
       'ns3': 'http://oval.mitre.org/XMLSchema/oval-definitions-5#independent'} 

for prefix, uri in namespaces.items(): 
    ET.register_namespace(prefix, uri) 
+0

Ваше решение добавляет соответствующие префиксы к соответствующим тегам. Но я хочу теги без префикса и сохраняя атрибут '' 'xmlns''' в' '' tag1''' и '' 'tag2''' – Naive

+2

@Kumarswamy Я не могу точно понять ваш вопрос, можете ли вы дать exmaple того, что вы ожидаете? Просто добавьте три вопроса в свой вопрос - 1) Текущий вход 2) Токовый выход 3) Ожидаемый выход. Было бы еще лучше, если бы вы могли поделиться сырым входным xml с помощью pastebin или gist –

+1

@Kumarswamy вы можете обновить вопрос? –

1

Как @mu 無 сказал, вы не сможете добиться того, что вы хотите с помощью register_namespace, который явно защищает от дублирования префиксов.

Я не уверен в том, что вы пытаетесь сделать, это юридическое XML или поддерживается в библиотеке, но один из способов, которые могли бы достичь того, что вы хотите реализовать behaviour из register_namespace непосредственно:

xml.etree.ElementTree._namespace_map[uri] = prefix # Replace uri and prefix. 

И как функция (модифицированный из оригинальной библиотеки Python source code):

import re 
import xml.etree.ElementTree 

def register_namespace(prefix, uri): 
    if re.match("ns\d+$", prefix): 
     raise ValueError("Prefix format reserved for internal use") 
    xml.etree.ElementTree._namespace_map[uri] = prefix 

я не рекомендуем DOI Это связано с тем, что он может повредить библиотеку в другом месте неожиданными способами.

Отказ от ответственности: Мой код не проверен.

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