Hi Mike,
here is a small example code which hopefully demonstrates my problem.
Every time when I add a new element, the XPath result list is empty.
The same XPath query after reading the document yields the expected
elements.
As you can see in the code, I used NamespaceContext/NamespaceURI but that
seems to have no effect at all.
But if you remove the namespace from the "xml:lang" attribute (keeping just
"lang") in the document and in the XPath query then everything is ok.
I don't know why.
Andreas
-- code --
import org.dom4j.*;
import org.dom4j.io.*;
import java.io.*;
import java.util.*;
public class DOMTest {
public static void main (String args[]) throws Exception {
DOMTest domTest = new DOMTest();
}
DocumentFactory factory;
Document document;
public DOMTest() throws Exception {
factory = DocumentFactory.getInstance();
Map uris = new HashMap();
uris.put("xml", "http://www.w3.org/XML/1998/namespace");
uris.put("ims", "http://www.imsglobal.org/xsd/imsmd_v1p2");
factory.setXPathNamespaceURIs(uris);
document = createDocument();
XMLWriter writer = new XMLWriter(new
FileOutputStream("domtest.xml"), OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
test("de");
SAXReader sr = new SAXReader();
document = sr.read(getClass().getResourceAsStream("domtest.xml"));
System.out.println(document.asXML());
test("de");
addLang();
System.out.println(document.asXML());
test("en");
}
public Document createDocument() {
Document document = factory.createDocument();
Element kern = document.addElement("kern")
.addNamespace("xsi",
"http://www.w3.org/2001/XMLSchema-instance")
.addAttribute("xsi:noNamespaceSchemaLocation", "movii-kern.xsd")
.addAttribute("xsi:schemaLocation",
"http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p2.xsd")
.addNamespace("xml",
"http://www.w3.org/XML/1998/namespace")
.addNamespace("ims",
"http://www.imsglobal.org/xsd/imsmd_v1p2");
Element metadata = kern.addElement("metadata");
Element lom = metadata.addElement("ims:lom");
Element general = lom.addElement("ims:general");
Element title = general.addElement("ims:title");
title.addElement("ims:langstring")
.addAttribute("xml:lang", "de").setText("Licht");
return document;
}
private void addLang() {
Element title = (Element)document.selectSingleNode("//ims:title");
if (title != null) {
title.addElement("ims:langstring")
.addAttribute("xml:lang", "en").setText("Light");
}
}
private void test(String lang) {
String xpathString = "//ims:langstring[@xml:lang='" + lang + "']";
Map uris = new HashMap();
uris.put("xml", "http://www.w3.org/XML/1998/namespace");
uris.put("ims", "http://www.imsglobal.org/xsd/imsmd_v1p2");
XPath xpath = document.createXPath(xpathString);
//xpath.setNamespaceContext(new
org.jaxen.SimpleNamespaceContext(uris));
xpath.setNamespaceURIs(uris);
System.out.println(xpath.selectNodes(document));
}
}
-- code --
> -----Urspr�ngliche Nachricht-----
> Von: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED]]Im Auftrag von Mike
> Skells
> Gesendet: Donnerstag, 29. August 2002 11:59
> An: [EMAIL PROTECTED]
> Cc: 'Dom4j-User@Lists. Sourceforge. Net'
> Betreff: RE: [dom4j-user] Does XPath consider the namespace of
> attributes?
>
>
> Andreas,
> No there are other ways, at least by setting the xpath mapping uri on
> the document factory
> Do you have some sample code?
>
> Mike
>
> > -----Original Message-----
> > From: [EMAIL PROTECTED]
> > [mailto:[EMAIL PROTECTED]]
> > Sent: Thursday 29 August 2002 09:44
> > To: Mike Skells
> > Cc: Dom4j-User@Lists. Sourceforge. Net
> > Subject: Re: [dom4j-user] Does XPath consider the namespace
> > of attributes?
> >
> >
> > Hi,
> >
> > you are rigth.
> > The problem does only appear when I'm creating a new document
> > in memory and then execute the mentioned XPath query. If I
> > read an existing XML document, like your example class b2,
> > everything is all right.
> >
> > So, is this behaviour normal to newly-created documents and
> > if yes, is the only alternative solution to store the
> > document and then read it again before executing the XPath query ?
> >
> > --
> > Andreas
> >
> >
> > > -----Urspr�ngliche Nachricht-----
> > > Von: Mike Skells [mailto:[EMAIL PROTECTED]]
> > > Gesendet: Mittwoch, 28. August 2002 20:33
> > > An: [EMAIL PROTECTED]
> > > Cc: Dom4j-User@Lists. Sourceforge. Net
> > > Betreff: RE: [dom4j-user] Does XPath consider the namespace of
> > > attributes?
> > >
> > >
> > > I cant reproduce the problem
> > >
> > > --- code ---
> > > import org.dom4j.*;
> > > import org.dom4j.io.*;
> > >
> > > public class b2 {
> > >
> > > public static void main(java.lang.String[] args) throws
> > Exception {
> > > new bug();
> > > }
> > > private Document doc ;
> > > public b2() throws Exception{
> > > SAXReader sr = new SAXReader();
> > > Document doc =
> > sr.read(getClass().getResourceAsStream("b2.xml"));
> > > System.out.println(doc.asXML());
> > >
> > > System.out.println(doc.selectNodes("//ims:title[@ims:lang='de']"));
> > >
> > > }
> > > }
> > > ---- output -----
> > > <?xml version="1.0" encoding="UTF-8"?>
> > > <kern xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> > > xmlns:ims="http://www.imsglobal.org/xsd/imsmd_v1p2"
> > > xsi:noNamespaceSchemaLocation="movii-kern.xsd"
> > > xsi:schemaLocation="http://www.imsglobal.org/xsd/imsmd_v1p2
> > > imsmd_v1p2p2.xsd">
> > > <metadata>
> > > <ims:title ims:lang="de">...</ims:title>
> > > </metadata>
> > > </kern>
> > > [org.dom4j.tree.DefaultElement@908ca1 [Element: <ims:title uri:
> > > http://www.imsglobal.org/xsd/imsmd_v1p2 attributes:
> > > [org.dom4j.tree.DefaultAttribute@dd46f7 [Attribute: name ims:lang
> > > value "de"]]/>]]
> > > -- end ---
> > >
> > > > -----Original Message-----
> > > > From: [EMAIL PROTECTED]
> > > > [mailto:[EMAIL PROTECTED]] On Behalf Of
> > > > Andreas Wille
> > > > Sent: Wednesday 28 August 2002 15:24
> > > > To: [EMAIL PROTECTED]
> > > > Subject: [dom4j-user] Does XPath consider the namespace
> > of attributes?
> > > >
> > > >
> > > > Hello,
> > > >
> > > > my question is whether XPath does consider the namespace of
> > > > attributes or not ?
> > > >
> > > > for example:
> > > >
> > > > <?xml version="1.0" encoding="UTF-8"?>
> > > > <kern xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> > > > xmlns:ims="http://www.imsglobal.org/xsd/imsmd_v1p2"
> > > > xsi:noNamespaceSchemaLocation="movii-kern.xsd"
> > > >
> > > > xsi:schemaLocation="http://www.imsglobal.org/xsd/imsmd_v1p2
> > > > imsmd_v1p2p2.xsd"> ... <metadata>
> > > > <ims:title ims:lang="de">...</ims:title>
> > > > </metadata>
> > > > ...
> > > > </kern>
> > > >
> > > > If I start the following XPath query
> > > >
> > > > rootElement.selectNodes("//ims:title[@ims:lang='de']")
> > > >
> > > > on the XML document below, I get an empty List.
> > > > But if I remove the namespace for the 'lang' attribute in the
> > > > document (<ims:title lang="de">...</ims:title>) and in the
> > > > XPath query ("//ims:title[@lang='de']") I get the expected
> > > > list of elements.
> > > >
> > > >
> > > > Has somebody similar experiences or can tell me what
> > XPath is doing?
> > > >
> > > > --
> > > > Andreas
> > > >
> > > > --
> > > > berlin.de - meine stadt im netz. Jetzt eigene eMail-adresse
> > > > @berlin.de sichern! http://webmail.berlin.de
> > > >
> > > >
> > > >
> > > > -------------------------------------------------------
> > > > This sf.net email is sponsored by: Jabber - The world's
> > > > fastest growing
> > > > real-time communications platform! Don't just IM. Build it in!
> > > > http://www.jabber.com/osdn/xim
> > > > _______________________________________________
> > > > dom4j-user mailing list
> > > > [EMAIL PROTECTED]
> > > > https://lists.sourceforge.net/lists/listinfo/d> om4j-user
> > > >
> > >
> >
>
>
>
>
> -------------------------------------------------------
> This sf.net email is sponsored by:ThinkGeek
> Welcome to geek heaven.
> http://thinkgeek.com/sf
> _______________________________________________
> dom4j-user mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/dom4j-user
>
>
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
dom4j-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/dom4j-user