Einzelnen Beitrag anzeigen

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