2017-03-10 33 views
0

我需要名字爲X的每個孩子名字爲AX的所有父節點。xpath - 命名空間 - 從每個名字爲B的孩子處得到名字爲A的所有父母

之後,我需要獲取節點類型的值。

我在Dynamo中使用Python 2.7和ElementTree工作。所以我不能使用lxml!

XML:

<main 
    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"> 

    <AX> 
      <gml:node> 
       <gml:X></gml:X> 
       <gml:X></gml:X> 
       <type>a</type> 
      </gml:node> 
    </AX> 
    <AX> 
      <gml:node> 
       <gml:D></gml:D> 
       <adv:type>b</adv:type> 
      </gml:node> 
    </AX> 
    <AX> 
      <gml:node> 
       <gml:X></gml:X> 
       <adv:type>c</adv:type> 
      </gml:node> 
    </AX> 
</main> 

代碼:

import clr 
import sys 
clr.AddReference('ProtoGeometry') 
from Autodesk.DesignScript.Geometry import * 
sys.path.append("C:\Program Files (x86)\IronPython 2.7\Lib") 

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() 

xpathstr=".//gml:X//..adv:[@name='AX']" 
xpathchild=".//adv:type" 

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"} 

parent = root.findall(xpathstr,ns) 

for x in parent: 
    match.append(x.findall(xpathchild,ns)) 

print parent,match 

的XPath: 我與第一個XPath問題:

".//gml:X//..adv:[@name='AX']" 

EDDIT:X孩子的父母的名字廣告:我需要這個

parent=[AX,AX,AX] 

:AX 鏈接:https://docs.python.org/2/library/xml.etree.elementtree.html 語法錯誤:無效的後裔

預期結果所有GML拿到賽= [a,a,c]

前兩個X具有相同的AX父項。那好,我需要一個重複節點的列表。

任何想法什麼是錯誤的我的第一個xpath?

+0

你想得到'[a,c]'還是'[a,a,c]'?你想兩次匹配相同的元素? – Andersson

+0

我想要a,a,c。不一樣的元素。有兩個元素具有相同的父項。我需要一個具有相同長度/出現元素X的列表。 – Yuli

回答

0

您的xml輸入無效。請注意,AX元件應關閉標籤。

AX元件限定與在線定義的默認名稱空間:

xmlns="http://www.adv-online.de/namespaces/adv/gid/6.0" 

由於還定義前綴,命名空間(的xmlns:進階=「http://www.adv-online.de /namespaces/adv/gid/6.0「),我們稍後可以在我們的xpath中使用它。

要獲取節點的所有家長:

//adv:AX[./gml:node/gml:X] 

或更一般的XPath:

//adv:AX[./gml:*/gml:X] 

如果你要複製你可以先使用XSLT轉換的父節點。

+0

對不起,無效的xml!我忘記提及AX和X之間的節點數量多得多。你的xpath'// adv:AX [./ gml:*/gml:X]'不適合我(SyntaxError:invalid predicate) – Yuli