Java

2011-01-14 16 views
16
yılında

Yani burada beyan ettik xml doc var, doğru ad olmadan Düğüm öğeleri bulun: Ben bir dize geçmek bir işlevi var SonraJava

DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder(); 
StringReader reader = new StringReader(s); 
InputSource inputSource = new InputSource(reader); 
doc_ = dBuilder.parse(inputSource); 

ve söylemek istiyorum benim xml bir öğeye eşleşmesi:

void foo(String str) 
{ 
    NodeList nodelist = doc_.getDocumentElement().getElementsByTagName(str); 
} 

sorundur str ben test olacağını xml olacağını bu yüzden de ad her türlü yok o gelince:

<Random> 
    <tns:node /> 
</Random> 

ve str düğümü olacaktır. Yani nodelist şimdi null çünkü neyi bekliyordu: node ama düğümde geçtim. Ve isim alanını görmezden gelmenin iyi olmadığını biliyorum ama bu durumda iyi. Benim sorunum, isim alanını yok sayarak bir element için Düğümü nasıl arayacağımı bilmem. Gelen str'ye isim alanını da eklemeyi düşündüm ama bunun nasıl yapılacağını da bilmiyorum.

Herhangi bir yardım büyük, -Josh

en basit çözüm dize manipülasyon yoluyla kendi kök düğüm eklemektir

cevap

26

adı ne olursa olsun adı 'str' olan aşağıdakileri kullanın:

NodeList nodes = doc.getDocumentElement().getElementsByTagNameNS("*", str); 

"*" joker karakteri herhangi bir isim alanıyla eşleşecektir. Bkz Element.getElementsByTagNameNS(...).

Düzenleme: ek olarak doğru bir yorum da belirtildiği @Wheezil nasıl, yoksa ad algılanmaz, çalışması için DocumentBuilderFactory.setNamespaceAware(true) aramak zorunda.

+0

Başka bir harika cevap RD01 için çok teşekkür ederim. – Grammin

+0

sorun :) –

+2

olarak, sadece "ad-aware" 'DocumentBuilderFactory' nesneler için çalışmak gibi @gramm DOM düzey 1 oluşturulan elemanlar yok bir' localName' ... Ayrıca –

2

Teşekkür mutluluk duyacağız tüm düğümlerin maç için

DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder(); 
s = "<root xmlns:tns=\"MyNamespace\">" + s + "</root>"; 
StringReader reader = new StringReader(s); 
InputSource inputSource = new InputSource(reader); 
doc_ = dBuilder.parse(inputSource); 
+0

Dize zaten üzerinde bir ad alanı var, bu ad alanını tanımak için yönteme eklediğim dize ihtiyacım var. – Grammin

+0

İşlenmeye çalıştığınız tam xml'nin en az bir örneğini gönderir misiniz? Gönderdiğiniz örnek xml, herhangi bir yerde bildirilmemiş bir ad alanı kullanıyor. İsim alanının tns iyi biçimlendirilmesi için XML belgesinin URL'sine eşlenmelidir (bkz. Http://en.wikipedia.org/wiki/XML_namespace#Namespace_declaration). –

+0

+ 1'e yardım etmeye çalıştığınız için teşekkürler ama RD01'in cevabı aradığım şeydi. – Grammin