Problem Referenzierung von Knoten, die direkt bei der Verwendung von XPath in Java

Ich habe mir vor kurzem traf eine Wand mit einem Problem mit Java ist die native XML-API (W3C), der in seinem Kern ist, dass wenn ich versuche, eine direkte XPath-Ausdruck in mein Dokument wie, sagen wir, //body den XPath wird als falsch ausgewertet (Falsches Verhalten), aber wenn ich die ersetzen, die mit //*[1] es als true ausgewertet (gewünschte Verhalten).

Ich habe mehrfach und mit verschiedenen Dokumenten, dass die XML die ich benutze, ist gültig (ich bin hauptsächlich mit XHTML 2.0 mit rest dieses system).

Da ich keine Ahnung habe, was wirklich verursacht, hier ist der Satz von Konfigurations-Optionen für verschiedene factory-Objekte, die ich verwende.

Wie Sie sehen können, habe ich viele benutzerdefinierte Implementierungen der verschiedenen Klassen bezogen auf die ganze Frage, die ich denke, haben etwas zu tun mit der Frage, aber ich bin mir nicht sicher, läuft, um mit unit-tests, spielen mit debugger und eine riesige Ladung .println:s hat nicht geholfen, mich noch.

XPath:

  • xpathfactory.setXPathFunctionResolver(myFunctionResolver)
  • xpath.setNamespaceContext(myNamespaceContext);
  • xpath.setXPathVariableResolver(myResolver);

DocumentBuilder:

(f == DocumentBuilderFactory)

  • f.f.setValidating(false);
  • f.setSchema(null);
  • f.setNamespaceAware(true);
  • f.setIgnoringComments(true);
  • f.setIgnoringElementContentWhitespace(true);
  • +features "http://xml.org/sax/features/validation", "http://apache.org/xml/features/validation/schema" und "http://apache.org/xml/features/nonvalidating/load-external-dtd" als false

(dc == DocumentBuilder)

  • dc.setEntityResolver(null);
  • dc.setErrorHandler(myErrorHandler);

Erwähnenswert ist auch, dass ich mit Sun Java 5 auf Windows XP.

Alle Ideen sind willkommen, an diesem Punkt, ich bin immer ziemlich frustriert, weil dieses Problem.

Abschluss

Es wurde ein namespace problem, das problem war, dass ich nicht erklären Standard namespace in myNamespaceContext an alle! Nur durch das hinzufügen

else {
    return "http://www.w3.org/1999/xhtml";
}

gemacht, das Ding funktioniert und jetzt habe ich es so gemacht, dass Standard-namespace erkannt wird. Funktioniert wie ein Charme! Beide Antworten hat mir geholfen, die Ursache zu finden und ich würde wählen beide als bevorzugte Antwort, wenn ich könnte.

InformationsquelleAutor Esko | 2009-03-16
Schreibe einen Kommentar