2012-04-23 3 views
0

У меня есть чрезвычайно большой xml-файл, который получен из области геоинформатики. я получил его от немецкого дочернего или OpenStreetMap-проекта: Geograpical-Инжиниринг-сайт, который deilvers еженедельный снимок OpenStreetMap определенной области: я взял germany.osm.bz2 отсюда http://ftp5.gwdg.de/pub/misc/openstreetmap/download.geofabrik.de/xslt-процессор возвращает только немного подмножества запрошенных/совпадающих тегов

Для выполнения некоторых тестов с xslt я хочу запустить запрос, чтобы узнать определенную сущность - возьмем, например, рестораны. мы хотим узнать все рестораны в этом районе.

теперь мы можем работать, что непосредственно на bz2 сжатый файл, который мы загрузили - например, если мы используем следующий код:

bzcat germany.osm.bz2 | xsltproc restaurants.xslt - > restaurants,csv 

хорошо я расщепляется файл с xml_split -Какой является большим perl- модуль из CPAN.

Проблемы: со следующим XSLT-процессором я получаю только плохие результаты - разобранные файлы не разобраны недостаточно активно использовали статистические достаточно я только получить незначительный набор информаций, когда я запустить код на XML-файл. см. xslt-процессор - и ниже - litt data-chunk из файла, который я запускаю и разбираю, если вы хотите его проверить - просто получите небольшой набор данных - обратите внимание, что это разделенный файл.

здесь вы можете получить его : https://rapidshare.com/#!download|643p12|2523227518|germany-001.xml|100000

Примечание: см поэтому важные строки: xmlns:xml_split="http://xmltwig.com/xml_split" и это один здесь:

<xsl:for-each select="xml_split:root/node/tag[@k='amenity' and @v='restaurant']"> 

Примечание - вы можете запустить небольшой тест - и посмотреть, сколько времени требуется для анализа времени xsltproc restaurants.xslt germany -001.xml> рестораны-001.csv

real 0m0.308s 
user 0m0.283s 
sys  0m0.022s 

здесь мы имеем XSLT-процессор, который содержит код для разбора - (так называемый atest3.xslt )

<xsl:stylesheet version = '1.0' 
     xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:xml_split="http://xmltwig.com/xml_split" 
     xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> 

    <xsl:output method="text" encoding="UTF-8"/> 
    <xsl:template match="/"> 

      <xsl:for-each select="xml_split:root/node/tag[@k='amenity' and @v='restaurant']"> 
      <xsl:value-of select="../@id"/> 
      <xsl:text>&#x09;</xsl:text> 
      <xsl:value-of select="../@lat"/> 
      <xsl:text>&#x09;</xsl:text> 
      <xsl:value-of select="../@lon"/> 
      <xsl:text>&#x09;</xsl:text> 
      <xsl:for-each select="../tag[@k='name']"> 
       <xsl:value-of select="@v"/> 
      </xsl:for-each> 
      <xsl:text>&#x0A;</xsl:text> 
     <xsl:value-of select="./tag[@k = 'cuisine']/@v"/> 
     <xsl:text>&#x09;</xsl:text> 
     <xsl:value-of select="./tag[@k = 'wheelchair']/@v"/> 
     <xsl:text>&#x09;</xsl:text> 
     <xsl:value-of select="./tag[@k = 'website']/@v"/> 
     <xsl:text>&#x09;</xsl:text> 
     <xsl:value-of select="./tag[@k = 'addr:country']/@v"/> 
     <xsl:text>&#x09;</xsl:text> 
     <xsl:value-of select="./tag[@k = 'addr:city']/@v"/> 
     <xsl:text>&#x09;</xsl:text>   
     <xsl:value-of select="./tag[@k = 'addr:street']/@v"/> 
     <xsl:text>&#x09;</xsl:text> 
     <xsl:value-of select="./tag[@k = 'addr:housenumber']/@v"/> 
     <xsl:text>&#x0A;</xsl:text> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

и здесь ниже мы имеем дата-фрагмент из XML-файла, который мы разобраны: увидеть

<node id="52768810" lat="48.2044749" lon="11.3249434" version="7" changeset="9490517" user="wheelmap_visitor" uid="290680" timestamp="2011-10-07T20:24:46Z"> 
    <tag k="addr:city" v="Olching" /> 
    <tag k="addr:country" v="DE" /> 
    <tag k="addr:housenumber" v="72" /> 
    <tag k="addr:postcode" v="82140" /> 
    <tag k="addr:street" v="Hauptstraße" /> 
    <tag k="amenity" v="restaurant" /> 
    <tag k="cuisine" v="mexican" /> 
    <tag k="email" v="[email protected]" /> 
    <tag k="name" v="La Cantina" /> 
    <tag k="opening_hours" v="Mo-Su 17:00-01:00" /> 
    <tag k="phone" v="+49 (8142) 444393" /> 
    <tag k="website" v="http://www.cantina-olching.com/" /> 
    <tag k="wheelchair" v="no" /> 
</node> 

увидеть результаты - внимание, что не хватает некоторых деталей - несчастливо ..

51923772 49.0812534 8.5637183 Zur Talschänke 

52040576 49.4635433 12.4287292 Emil-Kemmer-Haus 

52141326 49.4144243 12.4143153 Gasthaus Plecher 

52623232 48.9293634 8.2722549 Korfu 

52664989 49.0435133 8.3919370 Restaurant Zentrum 

52754898 49.3243828 12.3618662 Gasthaus Irlbacher 

52762875 49.0099641 8.2528132 Langasthof Stober 

52765672 50.0082768 9.2139632 Wirtshaus im Frohnrad 

52768810 48.2044749 11.3249434 La Cantina 

52768816 48.2051698 11.3257964 Indian Palace 

52768826 48.2073264 11.3276147 Dorfstub'n 

52768830 48.2075968 11.3281055 Le Candele 

52774284 49.0319471 8.2888353 Zum Anker 

Хорошо, это проблема, я получаю результаты - я старался много, но в настоящий момент я не знаю, почему я получаю небольшой результат - это полностью противоречит тегам, которые у меня есть в xslt-процессоре - любая идея, и намек будет значительно appreciatdd

кстати: ведь я хочу работать ки 5000 файлы, которые являются результатом раскола - и впоследствии я хочу собрать все результаты в MySQL-базе данных ...

здесь вы можете получить исходный файл: http://ftp5.gwdg.de/pub/misc/openstreetmap/download.geofabrik.de (germany.osm.bz2 01-A pr-2012 14:51 1.7G)

и здесь расщепляется одно: https://rapidshare.com/#!download|643p12|2523227518|germany-001.xml|100000

я должен реорганизовать студентке -так вопрос - это - как я могу получить MySQL-результаты на эффективный способ?

* обновление: * thx к первому ответу в этой теме i startet для рефакторинга кода, но все же отсутствие некоторых лучших результатов. я должен повторить его снова. Было предложено много изменений - я сделал быстрый проезд в синтаксическом анализаторе xslt: с первым испытанием по рефакторингу я получил некоторые смешные результаты. Но я попробую еще раз - я прохожу через весь код xslt-processor и смотрю ближе, если найду ошибки и, наконец, попытаюсь реорганизовать весь файл xslt. - любые указатели и субэлементы или фрагменты кода очень полезны. Приветствует ваш нулевой

ответ

2

Это выглядит как ваш ./tag[@k = '???']/@v XPath должна быть ../tag[@k='???'], потому что ваш узел контекста является исходным соответствующим tag элемент, а не node элемента.

Вы должны рассмотреть вопрос об изменении вашего контекстный узел, чтобы сделать этот код более понятным и избежать ошибок, как это:

<xsl:for-each select="xml_split:root/node[tag[@k='amenity' and @v='restaurant']]"> 

Затем вы можете использовать XPaths как select="tag/@id" и tag[@k='country']/@v.

Но вы должны рассмотреть возможность реорганизации этого кода, чтобы лучше использовать template вместо for-each.

+0

привет уважаемый Фрэнсис Авила - большое спасибо за подсказки - это здорово видеть такую ​​большую помощь, я стараюсь следовать всем вашим советам. Приветствую – zero

+0

много изменений, которые вы предлагаете - я сделал быстрый прохождение на xslt-parser: с первым испытанием по рефакторингу я получил некоторые смешные результаты. Но я попробую еще раз - я прохожу через весь код xslt-processor и смотрю ближе, если найду ошибки и, наконец, попытаюсь реорганизовать весь файл xslt. - любые указатели и субэлементы или фрагменты кода очень полезны. Приветствую ваш ноль – zero

+0

привет Фрэнсис - привет @ все - может у. дайте мне немного ** помогая рукой ** в ** рефакторинг ** код !? Это будет большой помощью. Большое спасибо – zero

Смежные вопросы