HTTPMOD: mit XPath Umlaute parsen

Begonnen von JudgeDredd, 21 Januar 2019, 13:24:43

Vorheriges Thema - Nächstes Thema

JudgeDredd

Hallo Zusammen,

zum Testen habe ich folgende (kleine) XML Datei erstellt:
<?xml version="1.0" encoding="UTF-8"?> 
<Namen> 
  <Name>A</Name>
  <Name>B</Name>
  <Name>Ä</Name>
  <Name>ß</Name>
</Namen> 


Das List des HTTPMOD Moduls:
Internals:
   BUSY       0
   CFGFN     
   DEF        https://fhem.integration.intranet/beispiel.xml 300
   Interval   300
   LASTSEND   1548071681.27112
   MainURL    https://fhem.integration.intranet/beispiel.xml
   ModuleVersion 3.5.4 - 9.11.2018
   NAME       httpmodXPathTest
   NR         625
   STATE      ???
   TRIGGERTIME 1548111995.84196
   TRIGGERTIME_FMT 2019-01-22 00:06:35
   TYPE       HTTPMOD
   XPathStrictEnabled 1
   addr       https://fhem.integration.intranet:443
   auth       0
   buf       
   code       200
   compress   1
   conn       
   data       
   displayurl https://fhem.integration.intranet/beispiel.xml
   header     
   host       fhem.integration.intranet
   httpheader HTTP/1.1 200 OK
Date: Mon, 21 Jan 2019 11:54:41 GMT
Server: Apache/2.4.35
Upgrade: h2c
Connection: Upgrade, close
Last-Modified: Mon, 21 Jan 2019 10:57:44 GMT
ETag: "8b-57ff5baf6ba00"
Accept-Ranges: bytes
Content-Length: 139
Content-Type: application/xml
   httpversion 1.0
   hu_blocking 0
   hu_filecount 14
   hu_port    80
   hu_portSfx
   ignoreredirects 0
   loglevel   4
   path       /beispiel.xml
   protocol   http
   redirects  0
   timeout    2
   url        https://fhem.integration.intranet/beispiel.xml
   value      0
   OLDREADINGS:
   QUEUE:
   READINGS:
     2019-01-21 12:54:41   ohne_Umlaut     A
   REQUEST:
     data       
     header     
     ignoreredirects 0
     retryCount 0
     type       get01
     url        https://fhem.integration.intranet/beispiel.xml
     value      0
   defptr:
     readingBase:
       EndDatTim  reading
       ohne_Umlaut reading
     readingNum:
       EndDatTim  02
       ohne_Umlaut 01
     readingOutdated:
     requestReadings:
       get01:
         EndDatTim  reading 02
         ohne_Umlaut reading 01
       update:
         EndDatTim  reading 02
   sslargs:
Attributes:
   enableXPath-Strict 1
   get01Name  Update
   reading01Name ohne_Umlaut
   reading01XPath-Strict /Namen/Name[text()='A']/text()
   reading02Name mit_Umlaut
   reading02XPath-Strict /Namen/Name[text()='ß']/text()
   room       ---Develop
   userattr   reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict
   verbose    5


Wie man sehen kann, wird nach einem "get httpmodXPathTest  Update" das Reading:
"ohne_Umlaut" mit dem Inhalt "A" erstellt.

Leider schaffe ich es aktuell nicht, das XPath die Umlaute findet und ein Reading erstellt.
Erfolglose Versuche bisher:
attr httpmodXPathTest get01Encode UTF-8
attr httpmodXPathTest get01Decode UTF-8
attr httpmodXPathTest reading02Encode UTF-8
attr httpmodXPathTest reading02Decode UTF-8

Nun meine Frage an das Forum und/oder den Modulautor (StefanStrobel), welche(s) Attribut(e) müssen gesetzt werden, damit auch
reading02XPath-Strict /Namen/Name[text()='ß']/text()
Ein Reading mit dem Wert "ß" erzeugt ?

und hier noch der Logauszug:
2019.01.21 12:09:44 5: httpmodXPathTest: ExtractReading ohne_Umlaut with XPath-Strict /Namen/Name[text()='A']/text()
2019.01.21 12:09:44 4: httpmodXPathTest: ExtractReading for reading02-1 sets ohne_Umlaut to A
2019.01.21 12:09:44 5: httpmodXPathTest: ExtractReading mit_Umlaut with XPath-Strict /Namen/Name[text()='ß']/text()
2019.01.21 12:09:44 5: httpmodXPathTest: ExtractReading mit_Umlaut did not match
2019.01.21 12:09:44 4: httpmodXPathTest: Read response to get01 matched Reading(s) ohne_Umlaut
2019.01.21 12:09:44 4: httpmodXPathTest: Read response to get01 did not match mit_Umlaut


Gruß,
JudgeDredd
Router: Eigenbau (pfSense)
FHEM: Proxmox (DELL R720) | Debian 12 (VM)

StefanStrobel

Hallo,

an Encode- / Decode- Attributen liegt es nicht. Die ändern nur die Kodierung der Ergebnisse, die in Readings gespeichert werden.
Der Ausgangstext liegt bei Dir (und in den Test, die ich gerade selbst gemacht habe) schon als UTF8 vor.
HTTPMOD gibt ihn dann an die LibXML mit

$hash->{ParserData}{XPathStrictNodeset} = XML::XPath->new(xml => $body)


Dein Suchtext wird später mit

$nodeset = $hash->{ParserData}{XPathStrictNodeset}->find($xpathst)

gesucht. Auch der Inhalt von $xpathst (/Namen/Name[text()='ß']/text()) ist dabei UTF8 kodiert.

Bei Deinen Beispielen mit Umlauten kommt nichts heraus. In meinen Tests war es genauso.

Leider bin ich nicht der XML / XPath-Spezialist. Ich habe es auch nur in HTTPMOD übernommen.
Eventuell liest ja jemand mit, der sich mit XPath bzw. der LibXML besser auskennt?

Gruss
   Stefan

amenomade

Funktioniert es mit reading02XPath-Strict /Namen/Name[text()='ß']/text()?
Oder ß?

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

JudgeDredd

Vielen Dank an Euch beide für die Vorschläge,

es hat mit meinen Tests etwas gedauert,
Zitat von: amenomadereading02XPath-Strict /Namen/Name[text()='ß']/text()
oder
ß
hatte ich sogar schon vor meinem Post erfolglos getestet.

Auf der Seite, kann ich den XPath für /Namen/Name[text()='ß']/text() erfolgreich durchführen.

Daher denke ich das es tatsächlich mit der LibXML zusammenhängt.

Vielleicht findet sich ja doch noch ein XPath Experte, der tiefer in der Materie steckt.

Gruß,
JudgeDredd
Router: Eigenbau (pfSense)
FHEM: Proxmox (DELL R720) | Debian 12 (VM)