2017-02-20 18 views
1

Мне нужен узел AX_Namensnummer, где дочерний узел istBestandteilVon имеет значение атрибута urn:adv:oid:DEBBAL0600001XOX.xpath - выберите родительский объект, где у ребенка есть определенное значение атрибута с помощью словаря пространства имен

И я хочу использовать словарь пространства имен.

Im работает в Динамо с Python 2.7 и ElementTree. Поэтому я не могу использовать lxml!

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<AX_Bestandsdatenauszug 
    xmlns="http://www.adv-online.de/namespaces/adv/gid/6.0" 
    xmlns:adv="http://www.adv-online.de/namespaces/adv/gid/6.0" 
    xmlns:gco="http://www.isotc211.org/2005/gco" 
    xmlns:gmd="http://www.isotc211.org/2005/gmd" 
    xmlns:gml="http://www.opengis.net/gml/3.2" 
    xmlns:ows="http://www.opengis.net/ows" 
    xmlns:wfs="http://www.adv-online.de/namespaces/adv/gid/wfs" 
    xmlns:wfsext="http://www.adv-online.de/namespaces/adv/gid/wfsext" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ogc="http://www.adv-online.de/namespaces/adv/gid/ogc" 
    xsi:schemaLocation="http://www.adv-online.de/namespaces/adv/gid/6.0 NAS-Operationen.xsd"> 

    <enthaelt> 
    <gml:featureMember> 
       <AX_Namensnummer gml:id="DEBBAL0600000XUm"> 
        <gml:identifier codeSpace="http://www.adv-online.de/">urn:adv:oid:DEBBAL0600000XUm</gml:identifier> 
        <istBestandteilVon xlink:href="urn:adv:oid:DEBBAL0600000XOX"/> 
        <benennt xlink:href="urn:adv:oid:DEBBAL0600000Y09"/> 
       </AX_Namensnummer> 
       <AX_Namensnummer gml:id="DEBBAL0600001XUm"> 
        <gml:identifier codeSpace="http://www.adv-online.de/">urn:adv:oid:DEBBAL0600001XUm</gml:identifier> 
        <istBestandteilVon xlink:href="urn:adv:oid:DEBBAL0600001XOX"/> 
        <benennt xlink:href="urn:adv:oid:DEBBAL0600000Y08"/> 
       </AX_Namensnummer> 
      </gml:featureMember> 
    </enthaelt> 
</AX_Bestandsdatenauszug> 

код:

import clr 
import sys 
clr.AddReference('ProtoGeometry') 
from Autodesk.DesignScript.Geometry import * 
sys.path.append("C:\Program Files (x86)\IronPython 2.7\Lib") 
#The inputs to this node will be stored as a list in the IN variables. 

path="file.xml" 
uniStr = unicode(open(path, 'r').read()) 
fixed = uniStr.encode('ascii', 'replace') 
fixed.decode('utf-8', 'replace') 
tree = ET.ElementTree(ET.fromstring(fixed)) 
root = tree.getroot() 

xpath=".//adv:AX_Namensnummer[adv:istBestandteilVon/@xlink:href='urn:adv:oid:DEBBAL0600001XOX']" 

ns = {"":"http://www.adv-online.de/namespaces/adv/gid/6.0", "adv":"http://www.adv-online.de/namespaces/adv/gid/6.0","gco":"http://www.isotc211.org/2005/gco", 
"gmd":"http://www.isotc211.org/2005/gmd","gml":"http://www.opengis.net/gml/3.2","ows":"http://www.opengis.net/ows", 
"wfs":"http://www.adv-online.de/namespaces/adv/gid/wfs","wfsext":"http://www.adv-online.de/namespaces/adv/gid/wfsext","xsd":"http://www.w3.org/2001/XMLSchema", 
"xlink":"http://www.w3.org/1999/xlink","xsi":"http://www.w3.org/2001/XMLSchema-instance","ogc":"http://www.adv-online.de/namespaces/adv/gid/ogc"} 

elem = root.find(xpath,ns) 

print elem 

XPath:

.//adv:AX_Namensnummer[adv:istBestandteilVon/@xlink:href='urn:adv : oid: DEBBAL0600001XOX ']

Ошибка:

SyntaxError: invalid predicate 

Любые идеи в том, что случилось? Может ли Python 2.7 и ElementTree обрабатывать этот вид xpath?

+0

Возможный дубликат [P ython XPath SyntaxError: недопустимый предикат] (http://stackoverflow.com/questions/33830821/python-xpath-syntaxerror-invalid-predicate) – Andersson

+0

Невозможно использовать lib lxml @ Andersson – Yuli

ответ

1

Ваш XPath, включая предикат, выглядит хорошо. Это должно быть limitation of ElementTree.

Может попробовать таргетинг на adv:istBestandteilVon с основным предикатом, а затем получить его родителя (.. является abbreviated syntax из parent::*) ...

xpath=".//adv:istBestandteilVon[@xlink:href='urn:adv:oid:DEBBAL0600001XOX']/.." 

EDIT

Чтобы вернуть только adv:AX_Namensnummer ...

xpath=".//adv:AX_Namensnummer/adv:istBestandteilVon[@xlink:href='urn:adv:oid:DEBBAL0600001XOX']/.." 
+0

Ваш Xpath в реальности вариант, но я получил действительно большой xml. Этот раздел был только примером. Когда я использую ваш xpath. У меня есть два или более родителей, потому что их больше, чем на 'adv: istBestandteilVon' с тем же значением в моем xml. Могу ли я спросить о конкретном родительском имени? как 'xpath =" .// adv: istBestandteilVon [@xlink: href = 'urn: adv: oid: DEBBAL0600001XOX']/.. adv: AX_Namensnummer "'? Этот пример не работает ... – Yuli

+0

@Yuli - оси 'parent ::' и 'self ::' не работают в ElementTree, поэтому вам нужно добавить 'adv: AX_Namensnummer' обратно в начало XPath. Я обновил свой ответ на примере. Если это не сработает, попробуйте обновить XML-пример, чтобы мы могли воспроизвести. –

+1

Ваш xpath работает! хорошо, THX за вашу помощь! – Yuli