1

lxml objectify と xpath を使用してデータを抽出し、xml ドキュメントを解析しようとしています。ドキュメントの一部を次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<Assets>
 <asset name="Adham">
  <pos>
   <x>27913.769923</x>
   <y>5174.627773</y>
  </pos>
   <description>Ba bla bla</description>
   <bar>(null)</bar>
  </general>
 </asset>
 <asset name="Adrian">
  <pos>
   <x>-179.477707</x>
   <y>5286.959359</y>
  </pos>
   <commodities/>
   <description>test test test</description>
   <bar>more bla</bar>
  </general>
 </asset>
</Assets>

私は次の方法を持っています:

def getALLattributesX(self, _root):
    '''Uses getattributeX and parses through the attribute dict, assigning
    values as it goes. _root is the main document root'''
    for k in self.attrib:
        self.getattributeX(_root, self.attribPaths[k], k)

...このメソッドを呼び出します:

def getattributeX(self, node, x_path, _attrib): 
    '''Gets a value from an xml node indicated by an xpath
    and assigns it to a the appropriate. If node does not exists
    it assigns "error"
    '''

    print node.xpath(x_path)[0].text
    try:
        self.attrib[_attrib] = node.xpath(x_path)
    except KeyError:
        self.misload = True
    #except AttributeError:
       # self.attrib[attrib] = "error loading " + attrib
        #self.misload = True

printステートメントはテストからのものです。最初のメソッドを実行すると、xml ドキュメントが解析され、各アセット オブジェクトで正常に停止します。ここで定義されているように、検索する変数の辞書と、使用するパスの補完的な辞書があります。

class tAssetList:

    alist = {} #dict of assets
    tlist = []
    tree = None # XML tree
    root = None #root elem

    def readXML(self, _filename):
        #Load file
        fileobject = open(_filename, "r") #read-only
        self.tree = objectify.parse(fileobject)
        self.root = self.tree.getroot()

        for elem in self.root.asset:
            temp_asset = tAsset()
            a_name = elem.get("name") # get name, which is the key for dict
            temp_asset.getALLattributesX(elem)
            self.alist[a_name] = temp_asset


class tAsset(obs.nxObject):
    def __init__(self):
        self.attrib = {"X_pos" : None,  "Y_pos" : None}
        self.attribPaths = {"X_pos" : '/pos/x',  "Y_pos" : '/pos/y'}

ただし、ノード(オブジェクト化されたxmlノード)でxpathを呼び出すと、xpathが機能していないようです。[ ] を直接等しいと出力するだけで、試してみると範囲外のインデックス エラーが発生します: [0].text.

ここで何が起こっているのですか?

4

1 に答える 1

4

/pos/xand/pos/yは絶対 XPath 式であり、指定された XML ドキュメントに最上位の要素がないため、どの要素も選択しませんpos

試してください

pos/x

pos/y
于 2011-03-29T12:33:28.510 に答える