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
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
Funktioniert es mit reading02XPath-Strict /Namen/Name[text()='ß']/text()
?
Oder ß
?
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