Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Antwort
 
Themen-Optionen
Alt 08.03.2006, 09:56   Nach oben    #1
Böreck
Neuer Benutzer
 
Registriert seit: 14.10.2004
Beiträge: 25
Standard Java DOM: Default Namespace Problem

Hallo,

ich benutze den DOM-Parser aus dem JDK 1.5 und wollte ein Dokument Parsen, welches einen default Namespace hat (also im Wurzelelement das Attribut xmlns="http://www.meine-url.de"). Weil ich eventuell später andere Namensräume erlauben will um Namenskonflikten aus dem Weg zu gehen, will ich die Methode getElementsByTagNameNS aus Element benutzen. Das liefert mir aber keine Ergebniss-Elemente, wenn ich den default Namespace als argument übergebe. Es wird noch nicht mal ein Element gefunden, wenn ich als Namensraum "*" oder null übergebe. Mit getElementsByTagName werden die Elemente gefunden. Überhaupt scheint der Parser nirgendwo diesen Namensraum zu vergeben. Wenn ich auf dem entstandenen Document-Objekt isDefaultNamespace mit meiner URL als Parameter aufrufe, wird false zurückgegeben, übergebe ich null wird true zurückgegeben. Rufe ich getNamespaceURI() auf dem Document-Objekt oder einem Kind-Element auf, wird null zurückgegeben.
Da ich weder Lust habe bei allen Elementen einen Prefix einzuführen, noch manuell in dem Wurzelelement nachzuschauen, ob das xmlns-Attribut richtig gesetzt ist und in dem Fall getElementsByTagName statt getElementsByTagNameNS zu verwenden, wüßte ich gerne ob es einen Weg gibt dem Document-Objekt beizubringen welchen default Namespace es hat.

Viele Grüße,
Max
Böreck ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.03.2006, 15:41   Nach oben    #2
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Hallo,
ich kann Dir Deine Frage zwar nicht beantworten, allerdings habe ich eine Frage hierzu:
Zitat:
Zitat von Böreck
Da ich weder Lust habe bei allen Elementen einen Prefix einzuführen
Was genau würde das denn ändern? :-/

Meinst Du, dass Du nur einen Namensraum vergibst und dann "Pseudo-namespaces" via Präfix?

Danke für die Information.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.03.2006, 18:56   Nach oben    #3
xardias
Erfahrener Benutzer
 
Benutzerbild von xardias
 
Registriert seit: 02.03.2006
Ort: Aachen
Beiträge: 123
Standard

Zitat:
Zitat von Ben
Hallo,
ich kann Dir Deine Frage zwar nicht beantworten, allerdings habe ich eine Frage hierzu:
Zitat:
Zitat von Böreck
Da ich weder Lust habe bei allen Elementen einen Prefix einzuführen
Was genau würde das denn ändern? :-/

Meinst Du, dass Du nur einen Namensraum vergibst und dann "Pseudo-namespaces" via Präfix?

Danke für die Information.
ich verstehe die frage schon, habe aber auch noch keine wirklich tolle lösung gefunden.

Ben: Man kann ein default namespace festlegen
<html xmlns="http://www.w3.org/1999/xhtml">
Alle in <html> enthaltene tags sind somit dem http://www.w3.org/1999/xhtml namespace zugeordnet.
Aber leider erhält man duch Aufruf von getNamespaceURI eines solchen elements NICHT http://www.w3.org/1999/xhtml sondern gar keinen namespace. Dies würde nur so funktionieren:

<html xmlns:htm="http://www.w3.org/1999/xhtml">
<htm:head>...</htm:head>
<...>
</html>

Bisher habe ich dieses prolem aber auch eher ignoriert udn noch kene praktische lösung gefunden
Also falls du was findest Böreck wäre ich an der Lösung auch SEHR interessiert.

gruß
Dennis

Jedoch w
xardias ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.03.2006, 10:23   Nach oben    #4
xardias
Erfahrener Benutzer
 
Benutzerbild von xardias
 
Registriert seit: 02.03.2006
Ort: Aachen
Beiträge: 123
Standard

Also ich habe mich jetzt mal selbst damit beschäftigt. Ich ahbe vorher Dom4J verwendet, wollte jetzt aber bei der Java API bleiben.
Ich parse folgende xml Datei:

HTML-Code:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.y2k1.org/thor/config">

	<import>org.thorframework.test</import>

	<engine class="PackageEngine">
		<property name="rootPackage" value="org.thorframework.test.core" />
	</engine>
	
	<module name="MailSender" class="MailSender">
		<property name="host" value="mail.y2k1.org" />
		<property name="username" value="dennis@xardias.net" />
		<property name="password" value="" />
		<property name="from" value="dennis@xardias.net" />
	</module>
	
</config>
Zum parsen verwende ich folgenden code:
Code:
public class XMLParserTest
{
	static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
	static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
	
	static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; 
	static final String THOR_SCHEMA_SOURCE = "schema/config.xsd";
	
	public static void main(String... args) throws Exception
	{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); // turn on schema validation
		factory.setAttribute(JAXP_SCHEMA_SOURCE, THOR_SCHEMA_SOURCE); // assign schema source
		factory.setValidating(true);
		factory.setNamespaceAware(true);
		
		DocumentBuilder documentBuilder = factory.newDocumentBuilder();
		
		Document document = documentBuilder.parse(new File("WEB-INF/thor.xml"));
		System.out.println(document.toString()+" - "+document.getNamespaceURI());
		
		// fetch the root node
		Node rootNode = document.getChildNodes().item(0);
		System.out.println(rootNode.toString()+" - "+rootNode.getNamespaceURI());
		
		// print its children
		for(int i=0; i<rootNode.getChildNodes().getLength(); ++i)
		{
			Node node = rootNode.getChildNodes().item(i);
			System.out.println(node.toString()+" - "+node.getNamespaceURI());
		}
	}
}
Ich lasse einfach die Namespace URI von allen child Nodes vom Root Node ausgeben, und diese werden auch korrekt als http://www.y2k1.org/thor/config angezeigt, und nicht als "no name" namespace.

vielleicht hilft es dir ja.
xardias ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.03.2006, 14:32   Nach oben    #5
Böreck
Neuer Benutzer
 
Registriert seit: 14.10.2004
Beiträge: 25
Standard

Autsch!
factory.setNamespaceAware(true); und alles ist gut.
Manchmal sieht man den Wald vor lauter Bäumen nicht mehr.

Vielen Dank!
Böreck ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Welches Join soll ich verwenden? Chr!s Datenbanken 8 06.07.2006 12:33
Query verbessern? björn Datenbanken 4 05.06.2006 13:48
Problem mit getNodeValue() und setNodeValue() in DOM Zauberlehrling HTML, XML und CSS 1 21.08.2005 19:08
[BUCH] Java ist auch eine Insel kampet Literatur 5 22.02.2005 14:40
Dom für html mit java bluelight Allgemeine Java-Programmierung 1 29.11.2004 16:28


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:48 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44