2012-04-18 11 views
1

JavaでDOMパーサーを使用して、既存のノードに子ノードを追加しようとしています。Java DOM getElementByID

私のXMLは

<?xml version="1.0" encoding="iso-8859-1"?> 
<chart> 
<chart renderTo="pieContainer" defaultSeriesType="pie" zoomType="xy" plotBackgroundColor="null" plotBorderWidth="null" plotShadow="false"></chart> 
<legend id="legendNode"> 
    <align>center</align> 
    <backgroundColor>null</backgroundColor> 
    <borderColor>#909090</borderColor> 
    <borderRadius>25</borderRadius> 
</legend> 
</chart> 

直接、既存のものの下に子ノードを追加する方法はありますか?このようなものを使うことはできますか?

Node myNode = nodesTheme.item(0); 
this.widgetDoc.getElementById("/chart/legend").appendChild(myNode); 

マイコード

import org.w3c.dom.*; 
import javax.xml.parsers.*; 
public class TestGetElementById { 
    public static void main(String[] args) throws Exception { 

     String widgetXMLFile = "piechart.xml"; 
     DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 

     domFactory.setNamespaceAware(true); 
     DocumentBuilder docBuilder = domFactory.newDocumentBuilder(); 
     Document doc = docBuilder.parse(widgetXMLFile); 
     Node n = doc.getElementById("/chart/legend"); 
     //Node n = doc.getElementById("legendTag"); 

     Element newNode = doc.createElement("root"); 
     n.appendChild(newNode); 
    } 
} 
+0

はいノードは問題なく追加できます。それは何か例外や問題を投げているのですか? – Phani

+0

はいそのスロー例外**スレッド "main"の例外java.lang.NullPointerException ** –

+1

@AnupSingh - Javaエラーメッセージです。あなたが提供したコードはそのエラーを生成しません。 – Quentin

答えて

2

getElementByIdは、特に彼らのid属性によってDOM要素を取得するためです。代わりにこれを試してみてください:DOMノードを取得する他の方法については

this.widgetDoc.getElementById("legendNode").appendChild(myNode); 

querySelectorquerySelectorAllに見えます。

+0

import org.w3c.dom。*; import javax.xml.parsers。*; public class TestGetElementById { public static void main(String [] args)例外をスローします。{ 文字列widgetXMLFile = "piechart.xml"; \t DocumentBuilderFactory domFactory = DocumentBuilderFactory。newInstance(); \t \t domFactory.setNamespaceAware(true); \t DocumentBuilder docBuilder = domFactory.newDocumentBuilder(); \tドキュメントdoc = docBuilder.parse(widgetXMLFile); \tノードn = doc.getElementById( "/ chart/legend"); \t //ノードn = doc.getElementById( "legendTag"); \t 要素newNode = doc.createElement( "root"); n.appendChild(newNode); } } –

+0

凡例ノードの 'id'属性は" legendTag "ではありません。それは "legendNode"です。それを試しましたか? – Brandan

+0

はい**私は** "legendNode"で試しました** –

2

編集:元の質問:はい、appendChildはあなたが計画した通りに動作しますが、問題はgetElementByIdにあります。

NullPointerExceptionは、そのIDを持つ要素がないことを意味します。 javadocはそれを離れて与える:

http://docs.oracle.com/javase/1.5.0/docs/api/org/w3c/dom/Document.html#getElementById(java.lang.String)

DOMの実装は、属性は属性がID型であるかどうかを判断するためにAttr.isId使用することが期待されています。だから、基本的にはDTDやドキュメントのスキーマのいずれかを必要と

DocumentBuilderFactory.setValidating(true) 

や設定を設定する必要が

http://docs.oracle.com/javase/1.5.0/docs/api/org/w3c/dom/Attr.html#isId()

:さらにはAttrのドキュメントで

とIsIdプロパティ。

は個人的に私が使用:(lazynessのための汚い&スカラ座)を

import org.w3c.dom.{Document,Node,Attr,Element} 

def idify (n:Node) { 
    if (n.getNodeType() == Node.ELEMENT_NODE){ 
     val e = n.asInstanceOf[Element ] 
     if (e.hasAttributeNS(null , "id"))e.setIdAttributeNS(null , "id" , true) 
    } 
    val ndlist = n.getChildNodes() 
    for (i <- 0 until ndlist.getLength) idify(ndlist.item(i)) 
} 

は確かに完全なDTD /スキーマを起草含まない、これを行うために、より専門的な方法があります。誰かが知っているならば、私も好奇心が強いです。

+0

多くのアプローチがリストされています(こちら)(https://fosswiki.liip.ch/display/BLOG/GetElementById+Pitfalls) まだJavaソリューションをコーディングしていません。 – HRJ