AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi Wie die Upper-case Funktion in XPath Suche verwenden?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie die Upper-case Funktion in XPath Suche verwenden?

Ein Thema von Boro · begonnen am 14. Jan 2010 · letzter Beitrag vom 15. Jan 2010
Antwort Antwort
Boro

Registriert seit: 2. Mai 2006
23 Beiträge
 
#1

Wie die Upper-case Funktion in XPath Suche verwenden?

  Alt 14. Jan 2010, 18:11
Hi,

ich brauche die Suche nach Element mit bestimmten Wert case-insensitive machen. Z.B. in books.xml Datei
Delphi-Quellcode:
<bookstore>
  <book>
    <title>Hobbit</title>
    <author>J.R.R.Tolkien</author>
    <published>2001-08-05</published>
    <price>5.71</price>
  </book>
  <book>
    <title>Narnia</title>
    <author>C.S.Lewis</author>
    <published>2002-03-21</published>
    <price>4.52</price>
  </book>
</bookstore>
brauche ich Element <book> mit dem SubKnoten <title> dessen Inhalt ist der Text 'Narnia' finden. Weil der Inhalt auch in klein oder alle in gross Buchstaben sein kann, währe eine Uppercase funktion behilflich.
In der w3schools XPath Tutorial steht unter den Funktionen auch upper-case. Ich versuchte es mit dem Code
Delphi-Quellcode:
var
  IDoc: IXMLDocument;
  INode: IXMLNode;
begin
  IDoc := LoadXMLDocument('.\books.xml');
  INode := SelectNode(IDoc.DocumentElement,'/bookstore/book[price<5]/title'); // diese Suche funkzioniert
  INode := SelectNode(IDoc.DocumentElement,'/bookstore/book[upper-case(title)=NARNIA]'); // diese hat Fehler
end;
Leider gibt der zweite Aufruf des SelectNode() eine "Exception class EOleException with 'message Unknown method. /bookstore/book[-->upper-case(title)<--=NARNIA]'.
Weist jemand was soll ich machen um die Funktion 'upper-case' bekannt machen?

Ich verwende Delphi2006 unter winXPSP3 und MSXML DomVendor.
Die Funktion SelectNode kommt aus einem Beitrag vom Midiar zum OpenXML. Die sieht so aus
Delphi-Quellcode:
function selectNode(xnRoot: IXmlNode; const nodePath: WideString): IXmlNode;
var
  intfSelect : IDomNodeSelect;
  dnResult : IDomNode;
  intfDocAccess : IXmlDocumentAccess;
  doc: TXmlDocument;
begin
  Result := nil;
  if not Assigned(xnRoot)
    or not Supports(xnRoot.DOMNode, IDomNodeSelect, intfSelect) then
    Exit;

  dnResult := intfSelect.selectNode(nodePath);
  if Assigned(dnResult) then
  begin
    if Supports(xnRoot.OwnerDocument, IXmlDocumentAccess, intfDocAccess) then
      doc := intfDocAccess.DocumentObject
    else
      doc := nil;
    Result := TXmlNode.Create(dnResult, nil, doc);
  end;
end;
Wie kann man zu der XPath Funktion upper-case kommen? Soll ich vieleicht die Type Library importieren von neueren Version der MSXML? Ich hab sie bis jetzt nicht importiert und weis eigentlich nicht welche Version ich verwende. Ich denke das es die default 4.0 Version ist. Ich mache zwar die winXP updates regelmasig aber verwnede nicht den MSOffice und IE. Kann mir jemand einen Tip geben wie die upper-case Funktion verwenden konnen?

Boro
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Wie die Upper-case Funktion in XPath Suche verwenden?

  Alt 15. Jan 2010, 00:48
Schau mal hier beginnend mit der Frage
Zitat:
Is there any way for me to do a string comparison that will be case-insensitive using XPath?
Demnach müsste folgender XPath Ausdruck möglich sein:
/bookstore/book[string-compare(title,'NARNIA','en-US','i')=0] Wenn es funktioniert, dann kannst du 'en-US' durch 'de' ersetzen.
Wenn du Glück hast werden dann sogar deutsche Umlaute berücksichtigt.
fork me on Github
  Mit Zitat antworten Zitat
Boro

Registriert seit: 2. Mai 2006
23 Beiträge
 
#3

Re: Wie die Upper-case Funktion in XPath Suche verwenden?

  Alt 15. Jan 2010, 01:49
Danke sx2008, aber leider funktioniert die string-compare Funktion nicht. Die Fehlermeldung ist die selbe
Zitat:
raised exception class EOleException with message 'Unknown method.
/bookstore/book[-->string-compare(title,'NARNIA','en-US','i')<--=0]'.
Warum ist auch diese Funktion als 'Unknown method'? Was mach ich denn nur falsch?

Bei der upper-case Funktion dachte ich, es geht nicht weil sie erst im XPath 2.0 implementiert ist.
Aber die string-compare sollte auch im XPath 1.0 dabei sein nach dem Artikel im MSDN.
Woher kommt der 'Unknown method' Fehler?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz