2017-03-10 18 views
0

名前Xのすべての子からAXという名前のすべての親ノードが必要です。xpath - namespaces - 名前が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に問題があります

EDDIT:Xの子供の名前ADVを持つ親:AX リンク:https://docs.python.org/2/library/xml.etree.elementtree.html にSyntaxError:無効な子孫

期待される結果:

parent=[AX,AX,AX] 

私はこれを必要とする:すべてのGMLからGET一致= [a、a、c]

最初の2つのXは同じAXの親を持ちます。それは大丈夫、私は重複したノードを持つリストが必要です。

私の最初のxpathに何か問題がありますか?

+0

'[a、c]'または '[a、a、c]'を取得しますか?あなたは同じ要素を2回マッチさせたいですか? – Andersson

+0

私はa、a、cが欲しいです。同じ要素ではありません。同じ親を持つ2つの要素があります。同じ長さ/要素Xの出現数のリストが必要です。 – Yuli

答えて

0

xml入力が無効です。 AX要素は、終了タグで閉じなければならないことに注意してください。

もその名前空間(のxmlns接頭辞が定義されているので
xmlns="http://www.adv-online.de/namespaces/adv/gid/6.0" 

:ADV = "http://www.adv-online.de

AX要素がラインで定義されているデフォルトの名前空間で修飾されました/namespaces/adv/gid/6.0 ")、後でxpathで使用できます。

ノードのすべての親を取得するには:あなたが最初のXSLT変換を使用することができ、親ノードを複製する場合は

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

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

以上の一般的なXPathを。

+0

申し訳ありません、有効なxml!あなたのxpath '// adv:AX [./ gml:*/gml:X]'は私のためには機能しません(SyntaxError:無効な述語) – Yuli

関連する問題