Ankündigung

Einklappen
Keine Ankündigung bisher.

XML (gml) Datei parsen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • XML (gml) Datei parsen

    Hallo liebes Forum,

    ich suche nach einer eleganten Möglichkeit, folgende xml-Datei (gml) zu parsen:


    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <gml:FeatureCollection xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.safe.com/gml/fme">
       <ezs:version>2</ezs:version>
       <ezs:reference class="16" key="BA2011_00001_1111"/>
       <gml:featureMember>
          <gml:surfaceProperty>
             <gml:Surface srsName="urn:adv:crs:ETRS89_UTM32">
                <gml:patches>
                   <gml:PolygonPatch>
                      <ezs:attr>4220</ezs:attr>
                      <gml:exterior>
                         <gml:Ring>
                            <gml:curveMember>
                               <gml:Curve>
                                  <ezs:prio>200</ezs:prio>
                                  <ezs:attr>8001</ezs:attr>
                                  <gml:segments>
                                     <gml:LineStringSegment>
                                        <gml:posList dimension="2">412575.990 5791993.100 412595.334 5791979.677 412590.991 5791956.384 412574.411 5791969.017 412575.990 5791993.100</gml:posList>
                                     </gml:LineStringSegment>
                                  </gml:segments>
                               </gml:Curve>
                            </gml:curveMember>
                         </gml:Ring>
                      </gml:exterior>
                   </gml:PolygonPatch>
                </gml:patches>
             </gml:Surface>
          </gml:surfaceProperty>
       </gml:featureMember>
    </gml:FeatureCollection>
    Ich möchte z.B. folgende Werte erhalten: BA2011_00001_1111, 200, 8001 und die Geometrie: 412575.990 5791993.100 412595.334 5791979.677 412590.991 5791956.384 412574.411 5791969.017 412575.990 5791993.100

    Der einzige Namespace, der bereits vorhanden ist, ist "gml".

    Ich habe nun versucht
    PHP-Code:
    $xmlFile 'daten2.gml';
    if (
    file_exists($xmlFile)) {

    $sxe simplexml_load_file($xmlFile,null,null,'ezs'true);
    $ns $sxe->getNamespaces(true);

    $child $sxe->children($ns['gml'])->Surface;

    echo 
    "<br>hallo $child"


    erhalte aber diverse Warnings und keinerlei Ausgabe der gewünschten Parameter:



    Warning: simplexml_load_file(): daten2.gml:2: namespace error : Namespace prefix xsi for schemaLocation on FeatureCollection is not defined in /srv/www/htdocs/xml_parser/xmlparser.php on line 73

    Warning: simplexml_load_file(): ml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.safe.com/gml/fme" in /srv/www/htdocs/xml_parser/xmlparser.php on line 73

    Warning: simplexml_load_file(): ^ in /srv/www/htdocs/xml_parser/xmlparser.php on line 73

    Warning: simplexml_load_file(): daten2.gml:3: namespace error : Namespace prefix ezs on version is not defined in /srv/www/htdocs/xml_parser/xmlparser.php on line 73

    Warning: simplexml_load_file(): <ezs:version>2</ezs:version> in /srv/www/htdocs/xml_parser/xmlparser.php on line 73


    Kann mir jemand einen Tipp geben, wie ich an die gewünschten Parameter komme?
    Danke und Grüße, Kai






  • #2
    Es sind "nur" Warnungen... Man kann die Ausgabe abschalten, aber lösen lässt sich das nicht, das Problem steckt im XML, bzw. es fehlt etwas

    Beispiel mit DOMDOcument
    PHP-Code:
    $xml_str = '<?xml version="1.0" encoding="UTF-8"?>
    <gml:FeatureCollection xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.safe.com/gml/fme">
       <ezs:version>2</ezs:version>
       <ezs:reference class="16" key="BA2011_00001_1111"/>
       <gml:featureMember>
          <gml:surfaceProperty>
             <gml:Surface srsName="urn:adv:crs:ETRS89_UTM32">
                <gml:patches>
                   <gml:PolygonPatch>
                      <ezs:attr>4220</ezs:attr>
                      <gml:exterior>
                         <gml:Ring>
                            <gml:curveMember>
                               <gml:Curve>
                                  <ezs:prio>200</ezs:prio>
                                  <ezs:attr>8001</ezs:attr>
                                  <gml:segments>
                                     <gml:LineStringSegment>
                                        <gml:posList dimension="2">412575.990 5791993.100 412595.334 5791979.677 412590.991 5791956.384 412574.411 5791969.017 412575.990 5791993.100</gml:posList>
                                     </gml:LineStringSegment>
                                  </gml:segments>
                               </gml:Curve>
                            </gml:curveMember>
                         </gml:Ring>
                      </gml:exterior>
                   </gml:PolygonPatch>
                </gml:patches>
             </gml:Surface>
          </gml:surfaceProperty>
       </gml:featureMember>
    </gml:FeatureCollection>';

    libxml_use_internal_errors(true);
    $dom = new DOMDocument();
    $dom->loadXML($xml_str);

    $xpath = new DOMXPath($dom);
    $res = $xpath->query('//gml:Surface');
    var_dump($res, $res->item(0));
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Wow, danke Dir Nur was genau ist es denn, das fehlt?
      Liegt es am fehlenden namespace? (ezs:attr)?

      Ich versuche seit einer Weile (erfolglos) diesen "nachträglich" zu definieren, mittels
      registerXPathNamespace('ns','ezs:attr');

      ....habe aber noch keinen Erfolg

      Kommentar


      • #4
        Und noch ein Nachtrag: Gibt es überhaupt die Möglichkeit die Werte des Tags: <ezs:reference class="16" key="BA2011_00001_1111"/> auszulesen?

        Kommentar


        • #5
          Scheint nicht mittels xpath möglich, vielleicht wegen der fehlenden "ezs" Namespacedefinition.

          Da bleibt nur noch das manuelle Suchen

          PHP-Code:
          $xpath = new DOMXPath($dom);
          $res $xpath->query('//gml:FeatureCollection');
          foreach(
          $res->item(0)->childNodes as $childNode) {
              if (
          strpos($childNode->nodeName'ezs:') !== false) {
                  echo 
          'node : '.$childNode->nodeName.PHP_EOL;

                  if (!empty(
          $childNode->nodeValue)) {
                      echo 
          'value : '.$childNode->nodeValue.PHP_EOL;

                  }
                  if (!empty(
          $childNode->attributes)) {
                      foreach(
          $childNode->attributes as $attr) {
                          echo 
          'attribute: '.$attr->name.' = '.$attr->value.PHP_EOL;
                      }
                  }
              }


          Code:
          node : ezs:version
          value : 2
          node : ezs:reference
          attribute: class = 16
          attribute: key = BA2011_00001_1111
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            Danke Dir vielmals, das ist auch ein eleganter Weg.

            Ich habe auch soeben noch einen gefunden:

            Code:
            <?xml version="1.0" encoding="UTF-8"?>
            <gml:FeatureCollection xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.safe.com/gml/fme">
               <ezs:version>2</ezs:version>
               <ezs:reference class="16" key="BA2011_00001_1111"/>
               <gml:featureMember>
                  <gml:surfaceProperty>
                     <gml:Surface srsName="urn:adv:crs:ETRS89_UTM32">
                        <gml:patches>
                           <gml:PolygonPatch>
                              <ezs:attr>4220</ezs:attr>
                              <gml:exterior>
                                 <gml:Ring>
                                    <gml:curveMember>
                                       <gml:Curve>
                                          <ezs:prio>200</ezs:prio>
                                          <ezs:attr>8001</ezs:attr>
                                          <gml:segments>
                                             <gml:LineStringSegment>
                                                <gml:posList dimension="2">412575.990 5791993.100 412595.334 5791979.677 412590.991 5791956.384 412574.411 5791969.017 412575.990 5791993.100</gml:posList>
                                             </gml:LineStringSegment>
                                          </gml:segments>
                                       </gml:Curve>
                                    </gml:curveMember>
                                 </gml:Ring>
                              </gml:exterior>
                           </gml:PolygonPatch>
                        </gml:patches>
                     </gml:Surface>
                  </gml:surfaceProperty>
               </gml:featureMember>
            </gml:FeatureCollection>
            Wird interpretiert durch:


            Code:
            $xmlFile = 'daten2.gml';
            //Parse the XML
            $xml = @simplexml_load_file($xmlFile);
            $xpath = $xml->xpath( '//gml:PolygonPatch' );
            
            $ezs_attr = (string) $xpath[0]->attr;
            
            echo "The value0: $ezs_attr";
            $xpath2 = $xml->xpath( '//gml:Curve' );
            $xpath3 = $xml->xpath( '//gml:posList' );
            $xpath4 = $xml->xpath( '//gml:FeatureCollection' );
            $curve_ezs_prio = (string) $xpath2[0]->prio;
            $curve_ezs_attr = (string) $xpath2[0]->attr;
            echo "<br>";
            echo "The value1: $curve_ezs_prio";
            echo "<br>";
            echo "The value2: $curve_ezs_attr";
            echo "<br>";
            echo "The value3: ".$xpath3[0];
            echo "<br>";
            echo "The value4: ".$xpath4[0];
            echo "<br>";
            echo "The value5: ".$xpath4[0]->reference->attributes()->key;

            Und ergibt dann:
            The value0: 4220
            The value1: 200
            The value2: 8001
            The value3: 412575.990 5791993.100 412595.334 5791979.677 412590.991 5791956.384 412574.411 5791969.017 412575.990 5791993.100
            The value4:
            The value5: BA2011_00001_1111

            Kommentar


            • #7
              Jo, mein Beispiel hat nur die erste Kind-Ebene untersucht.. müsste man sich ne rekursive Funktion bauen, die sich durch das gesamte Dokument hangelt.
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar

              Lädt...
              X