2011-08-02 13 views
5

Cách tốt nhất để xử lý việc thiếu vùng tên trên một số nút trong tài liệu xml bằng lxml là gì? Trước tiên tôi có nên sửa đổi tất cả các nút Không có tên được đặt để thêm tên "gmd" và sau đó thay đổi thuộc tính cây thành tên http://www.isotc211.org/2005/gmd là "gmd" không? Nếu vậy, có cách nào sạch sẽ để làm điều này với lxml hoặc cái gì khác mà sẽ được tương đối sạch/an toàn?Làm thế nào để sử dụng xpath từ lxml trên các nút không có tên null?

from lxml import etree 
nsmap = charts_tree.nsmap 
nsmap.pop(None) # complains without this on the xpath with 
# TypeError: empty namespace prefix is not supported in XPath 
len (charts_tree.xpath('//*/gml:Polygon',namespaces=nsmap)) 
# 1180 
len (charts_tree.xpath('//*/DS_DataSet',namespaces=nsmap)) 
# 0 ... Bummer! 
len (charts_tree.xpath('//*/DS_DataSet')) 
# 0 ... Also a bummer 

ví dụ: http://www.charts.noaa.gov/ENCs/ENCProdCat_19115.xml

<DS_Series xmlns="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gsr="http://www.isotc211.org/2005/gsr" xmlns:gss="http://www.isotc211.org/2005/gss" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd"> 
<composedOf> 
    <DS_DataSet> 
     <has> 
      <MD_Metadata> 
       <parentIdentifier> 
        <gco:CharacterString>NOAA ENC Product Catalog</gco:CharacterString> 
       </parentIdentifier> 
... 
<EX_BoundingPolygon> 
    <polygon> 
     <gml:Polygon gml:id="US1AK90M_P1"> 
      <gml:exterior> 
       <gml:LinearRing> 
        <gml:pos>67.61505 -178.99979</gml:pos> 
        <gml:pos>73.99999 -178.99979</gml:pos> 
... 
        <gml:pos>64.99997 -178.99979</gml:pos> 
        <gml:pos>67.61505 -178.99979</gml:pos> 
       </gml:LinearRing> 

Trả lời

9

Tôi tin DS_DataSet của bạn là nhờ việc trong DS_Series (ám chỉ một không gian tên mặc định của "http://www.isotc211.org/2005/gmd") mang theo một namespace.

Hãy thử và ánh xạ nó vào từ điển không gian tên của bạn (bạn có thể thử nghiệm lần đầu tiên thông qua một bản in để xem nó đã có trong đó chưa, thêm nó và tham khảo không gian tên bằng khóa mới của bạn).

nsmap['some_ns'] = "http://www.isotc211.org/2005/gmd" 
len (charts_tree.xpath('//*/some_ns:DS_DataSet',namespaces=nsmap)) 

nào trở thành:

nsmap['gmd'] = nsmap[None] 
nsmap.pop(None) 
len(charts_tree.xpath('//*/gmd:DS_DataSet',namespaces=nsmap)) 
+0

này có vẻ đúng, nhưng tôi không có guru. –

+2

Lạ nhưng nó hoạt động –