2016-07-19 3 views
1

KMLのdescriptionタグ内のhtmlを新しいフォーマット済みhtmlに置き換えたいと考えています。<description>のlxmlを使用したKMLのhtmlコンテンツの編集

私のKMLは、この構造を有する:

<html> 
<body> 
    <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2"> 
    <document id="WATER_MAINLINE_trim" xsi:schemalocation="http://www.opengis.net/kml/2.2 http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd http://www.google.com/kml/ext/2.2 http://code.google.com/apis/kml/schema/kml22gx.xsd"> 
    <name> 
    WATER_MAINLINE_trim 
    </name> 
    <open> 
    1 
    </open> 
    <snippet maxlines="0"> 
    </snippet> 
    <style id="LineStyle00"> 
    <LabelStyle> 
      <color>00000000</color> 
      <scale>0</scale> 
     </LabelStyle> 
     <LineStyle> 
      <color>ff240087</color> 
     </LineStyle> 
     <PolyStyle> 
      <color>00000000</color> 
      <outline>0</outline> 
     </PolyStyle> 
    </style> 
    <folder id="FeatureLayer0"> 
    <name> 
     WATER_MAINLINE_trim 
    </name> 
    <open> 
     1 
    </open> 
    <snippet maxlines="0"> 
    </snippet> 
    <placemark id="ID_00000"> 
     <name> 
     0100026491 
     </name> 
     <snippet maxlines="0"> 
     </snippet> 
     <description> 
     <meta content="text/html" http-equiv="Content-Type" /> 
     <meta content="text/html; charset=utf-8" http-equiv="content-type" /> 
     <table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-collapse:collapse;padding:3px 3px 3px 3px"> 
     <tr style="text-align:center;font-weight:bold;background:#9CBCE2"> 
     <td> 
      0100026491 
     </td> 
     </tr> 
     <tr> 
     <td> 
      <table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-spacing:0px; padding:3px 3px 3px 3px"> 
      <tr> 
      <td> 
      FID 
      </td> 
      <td> 
      0 
      </td> 
      </tr> 
      <tr bgcolor="#D4E4F3"> 
      <td> 
      PRIKEY 
      </td> 
      <td> 
      0100026491 
      </td> 
      </tr> 
      <tr> 
      <td> 
      YEAR_INST 
      </td> 
      <td> 
      2001 
      </td> 
      </tr> 
      <tr bgcolor="#D4E4F3"> 
      <td> 
      PIPE_CLASS 
      </td> 
      <td> 
      PRIMARY 
      </td> 
      </tr> 
      <tr> 
      <td> 
      DIAMETER 
      </td> 
      <td> 
      1500 
      </td> 
      </tr> 
      <tr bgcolor="#D4E4F3"> 
      <td> 
      MATERIAL 
      </td> 
      <td> 
      SP 
      </td> 
      </tr> 
      <tr> 
      <td> 
      STATUS 
      </td> 
      <td> 
      ACTIVE 
      </td> 
      </tr> 
      <tr bgcolor="#D4E4F3"> 
      <td> 
      BA 
      </td> 
      <td> 
      FCOM 
      </td> 
      </tr> 
      <tr> 
      <td> 
      SUBCLASS 
      </td> 
      <td> 
      WATER MAINLINE 
      </td> 
      </tr> 
      </table> 
     </td> 
     </tr> 
     </table> 
     </description> 
    </placemark> 
    </folder> 
    </document> 
    </kml> 
</body> 
</html> 

をそして私は、この新しいHTML持っている:私は正常になり、まだlxmlのを使用して解析されたKMLの内側にそれを交換し、どうすればよい

newhtml="""<![CDATA[ \n<!------------TITLE SUBCLASS---------------->\n <tr>\n <td colspan="2" align="center">\n  <b><font color=\'#090259\' size=\'6\' style = \'bold\'>LA MESA BALARA</font><b>\n </td>/n </tr>\n<!------------IMAGE---------------->\n <tr>\n <td colspan="2" align="center">\n  <img src= http://static.rappler.com/images/640-lamesadam-20120728.jpg, width=500, height = 223, alt="picture" />\n </td>\n </tr>\n<!------------PRIKEY---------------->\n <tr>\n <td bgcolor = \'#090259\', align="center" >\n  <p><font color = \'FFFFFF\', size =\'4\'>PRIKEY</p>\n </td>\n \n <td bgcolor = \'#d8d8ff\' align="center">\n  <p>0100026491</p>\n </td>\n<!------------YEAR INSTALLED---------------->\n <tr>\n <td bgcolor = \'#090259\', align="center" >\n  <p><font color = \'FFFFFF\', size =\'4\'>Year Installed</p>\n </td>\n \n <td bgcolor = \'#d8d8ff\' align="center">\n  <p>2001</p>\n </td>\n<!------------PIPE CLASS---------------->\n <tr>\n <td bgcolor = \'#090259\', align="center" >\n  <p><font color = \'FFFFFF\', size =\'4\'>Pipe Class</p>\n </td>\n \n <td bgcolor = \'#d8d8ff\' align="center">\n  <p>PRIMARY</p>\n </td>\n<!------------DIAMETER---------------->\n <tr>\n <td bgcolor = \'#090259\', align="center" >\n  <p><font color = \'FFFFFF\', size =\'4\'>Diameter (mm)</p>\n </td>\n \n <td bgcolor = \'#d8d8ff\' align="center">\n  <p>1500.000000</p>\n </td>\n<!------------MATERIAL---------------->\n <tr>\n <td bgcolor = \'#090259\', align="center" >\n  <p><font color = \'FFFFFF\', size =\'4\'>Material</p>\n </td>\n \n <td bgcolor = \'#d8d8ff\' align="center">\n  <p>SP</p>\n </td>\n<!------------STATUS---------------->\n <tr>\n <td bgcolor = \'#090259\', align="center" >\n  <p><font color = \'FFFFFF\', size =\'4\'>Status</p>\n </td>\n \n <td bgcolor = \'#d8d8ff\' align="center">\n  <p>ACTIVE</p>\n </td>\n<!------------BUSINESS ADDRESS---------------->\n <tr>\n <td bgcolor = \'#090259\', align="center" >\n  <p><font color = \'FFFFFF\', size =\'4\'>Business Address</p>\n </td>\n \n <td bgcolor = \'#d8d8ff\' align="center">\n  <p>Fairview-Commonwealth</p>\n </td>]]>""" 

を有効なKMLですか? 「有効」とは、Google Earthに読み込むことができるkmlに関連しています。私はBeautifulSoupを使用して置換を試みましたが、Google Earthにロードすると、出力ファイルにエラーが発生します。それは、"予期しない要素" html ""と言います。ですから、代わりにlxmlを使用したいだけです。どんな助けもありがとう。ありがとうございました!

5つのLineString目印を含むこのサンプルのkmlがあります。

trim.kml = https://sites.google.com/site/kmlhostingmwss/trim.kml

+0

KMLドキュメントの名前空間を確認してください。 'xsi'接頭辞は' '根で宣言されていません(整形式ではない)。私は ''のコピーエラーを想定しています。 – Parfait

+0

それを指摘してくれてありがとう@パルフェット。 Btw、もしあなたがGISに慣れていれば、ArcGISで 'Layer to KML'を使ってkmlを取得しました。基本的には、その名前空間でこのようなkml構造を与えるArcGISです。再度、感謝します! –

答えて

0

KMLはXSLTを検討し、有効なXMLファイルであるため、XML文書やPythonのlxmlのを修正するために特に使用変換言語は、XSLT 1.0のスクリプトを実行することができます。

具体的には、ダイナミックXSLTの下にある文字列を解析し、最初にアイデンティティ変換を実行してドキュメントをそのままコピーした後、<description>のすべての出現をnewhtml変数に置き換えます。

import lxml.etree as ET 

# READ IN KML FILE 
dom = ET.parse('trim.kml') 

newhtml = """<![CDATA[\n<!------------TITLE SUBCLASS---------------->\n <tr>\n <td colspan="2" align="center">\n  <b><font color=\'#090259\' size=\'6\' style = \'bold\'>LA MESA BALARA</font><b>\n </td>/n </tr>\n<!------------IMAGE---------------->\n <tr>\n <td colspan="2" align="center">\n  <img src= http://static.rappler.com/images/640-lamesadam-20120728.jpg, width=500, height = 223, alt="picture" />\n </td>\n </tr>\n<!------------PRIKEY---------------->\n <tr>\n <td bgcolor = \'#090259\', align="center" >\n  <p><font color = \'FFFFFF\', size =\'4\'>PRIKEY</p>\n </td>\n \n <td bgcolor = \'#d8d8ff\' align="center">\n  <p>0100026491</p>\n </td>\n<!------------YEAR INSTALLED---------------->\n <tr>\n <td bgcolor = \'#090259\', align="center" >\n  <p><font color = \'FFFFFF\', size =\'4\'>Year Installed</p>\n </td>\n \n <td bgcolor = \'#d8d8ff\' align="center">\n  <p>2001</p>\n </td>\n<!------------PIPE CLASS---------------->\n <tr>\n <td bgcolor = \'#090259\', align="center" >\n  <p><font color = \'FFFFFF\', size =\'4\'>Pipe Class</p>\n </td>\n \n <td bgcolor = \'#d8d8ff\' align="center">\n  <p>PRIMARY</p>\n </td>\n<!------------DIAMETER---------------->\n <tr>\n <td bgcolor = \'#090259\', align="center" >\n  <p><font color = \'FFFFFF\', size =\'4\'>Diameter (mm)</p>\n </td>\n \n <td bgcolor = \'#d8d8ff\' align="center">\n  <p>1500.000000</p>\n </td>\n<!------------MATERIAL---------------->\n <tr>\n <td bgcolor = \'#090259\', align="center" >\n  <p><font color = \'FFFFFF\', size =\'4\'>Material</p>\n </td>\n \n <td bgcolor = \'#d8d8ff\' align="center">\n  <p>SP</p>\n </td>\n<!------------STATUS---------------->\n <tr>\n <td bgcolor = \'#090259\', align="center" >\n  <p><font color = \'FFFFFF\', size =\'4\'>Status</p>\n </td>\n \n <td bgcolor = \'#d8d8ff\' align="center">\n  <p>ACTIVE</p>\n </td>\n<!------------BUSINESS ADDRESS---------------->\n <tr>\n <td bgcolor = \'#090259\', align="center" >\n  <p><font color = \'FFFFFF\', size =\'4\'>Business Address</p>\n </td>\n \n <td bgcolor = \'#d8d8ff\' align="center">\n  <p>Fairview-Commonwealth</p>\n </td>]]>""" 

# PARSE XSL FROM STRING 
xslstr = '''<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
xmlns:ogc="http://www.opengis.net/ogc" xmlns:wfs="http://www.opengis.net/wfs"> 
<xsl:output version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="description"> 
    <xsl:copy> 
     <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> 
     <xsl:text disable-output-escaping="yes">{}</xsl:text> 
     <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text> 
    </xsl:copy> 
    </xsl:template> 

</xsl:transform>'''.format(newhtml) 

xslt = ET.fromstring(xslstr) 

# TRANSFORM SOURCE TO NEW TREE 
transform = ET.XSLT(xslt) 
newdom = transform(dom) 

# OUTPUT TO FILE 
tree_out = ET.tostring(newdom, encoding='UTF-8', pretty_print=True, xml_declaration=True) 

xmlfile = open('newTrim.kml','wb') 
xmlfile.write(tree_out) 
xmlfile.close() 
+0

こんにちは@パルフェット!私はエラーが発生します:あなたのコードを使用すると、 "XMLSyntaxError:Document上のschemaLocationのネームスペース接頭辞xsiは定義されていません。行3、列32"私はXSLTとXML構造を勉強しようとしましたが、それでも動作させることはできません。もっと助けてもらえますか?どうもありがとうございます! –

+0

これはXSLTエラーではなく、ソースファイルを解析する際のXMLエラーです: 'dom = ET.parse( 'trim.kml')'。上記の私のコメントを参照してください。 KMLは整形式のXMLファイルではありません(https://developers.google.com/kml/documentation/kml_tut)。 'xsi'名前空間接頭辞は' 'タグで使用する前に宣言する必要があります。 – Parfait

関連する問題