各要素を印刷するXMLのすべての要素をループしたい。私の問題は、staff1
タグ、つまりjohn 465456433 gmail1 area1 city1
の後にnullポインター例外を取得し続けることです。
このmy Java xmlファイルのすべての要素を印刷するコード:
File fXmlFile = new File("file.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("*");
System.out.println("----------------------------");
Node n=null;
Element eElement=null;
for (int i = 0; i < nList.getLength(); i++) {
System.out.println(nList.getLength());
n= nList.item(i);
System.out.println("\nCurrent Element :" + n.getNodeName());
if (n.getNodeType() == Node.ELEMENT_NODE) {
eElement = (Element) n.getChildNodes();
System.out.println("\nCurrent Element :" + n.getNodeName());
name = eElement.getElementsByTagName("name").item(i).getTextContent(); //here throws null pointer exception after printing staff1 tag
phone = eElement.getElementsByTagName("phone").item(i).getTextContent();
email = eElement.getElementsByTagName("email").item(i).getTextContent();
area = eElement.getElementsByTagName("area").item(i).getTextContent();
city = eElement.getElementsByTagName("city").item(i).getTextContent();
}
n.getNextSibling();
}
XMLファイル:
<?xml version="1.0"?>
<company>
<staff1>
<name>john</name>
<phone>465456433</phone>
<email>gmail1</email>
<area>area1</area>
<city>city1</city>
</staff1>
<staff2>
<name>mary</name>
<phone>4655556433</phone>
<email>gmail2</email>
<area>area2</area>
<city>city2</city>
</staff2>
<staff3>
<name>furvi</name>
<phone>4655433</phone>
<email>gmail3</email>
<area>area3</area>
<city>city3</city>
</staff3>
</company>
期待される出力:
john
465456433
gmail1
area1
city1
mary
4655556433
gmail2
area2
city2
furvi
4655433
gmail3
area3
city3
_ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document dom = db.parse("file.xml");
Element docEle = dom.getDocumentElement();
NodeList nl = docEle.getChildNodes();
int length = nl.getLength();
for (int i = 0; i < length; i++) {
if (nl.item(i).getNodeType() == Node.ELEMENT_NODE) {
Element el = (Element) nl.item(i);
if (el.getNodeName().contains("staff")) {
String name = el.getElementsByTagName("name").item(0).getTextContent();
String phone = el.getElementsByTagName("phone").item(0).getTextContent();
String email = el.getElementsByTagName("email").item(0).getTextContent();
String area = el.getElementsByTagName("area").item(0).getTextContent();
String city = el.getElementsByTagName("city").item(0).getTextContent();
}
}
}
_
すべての子を反復処理し、nl.item(i).getNodeType() == Node.ELEMENT_NODE
を使用してテキストノードを除外します。 XMLに他に何もない場合、残っているのはスタッフノードです。
スタッフ(名前、電話、電子メール、エリア、都市)の下の各ノード
_ el.getElementsByTagName("name").item(0).getTextContent();
_
el.getElementsByTagName("name")
はstuffの下にある「name」ノードを抽出し、.item(0)
は最初のノードを取得し、.getTextContent()
は内部のテキストコンテンツを取得します。
編集:ジャクソンがあるので、これを別の方法で行います。オブジェクトのpojoを定義します:
_public class Staff {
private String name;
private String phone;
private String email;
private String area;
private String city;
...getters setters
}
_
ジャクソンを使用して:
_ JsonNode root = new XmlMapper().readTree(xml.getBytes());
ObjectMapper mapper = new ObjectMapper();
root.forEach(node -> consume(node, mapper));
private void consume(JsonNode node, ObjectMapper mapper) {
try {
Staff staff = mapper.treeToValue(node, Staff.class);
//TODO your job with staff
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
_
public class XMLParser {
public static void main(String[] args){
try {
DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = dBuilder.parse(new File("xml input"));
NodeList nl=doc.getDocumentElement().getChildNodes();
for(int k=0;k<nl.getLength();k++){
printTags((Node)nl.item(k));
}
} catch (Exception e) {/*err handling*/}
}
public static void printTags(Node nodes){
if(nodes.hasChildNodes() || nodes.getNodeType()!=3){
System.out.println(nodes.getNodeName()+" : "+nodes.getTextContent());
NodeList nl=nodes.getChildNodes();
for(int j=0;j<nl.getLength();j++)printTags(nl.item(j));
}
}
}
整形式のxmlであれば、xmlの動的な変更を処理するためにコードを変更する必要がない場合、ドキュメント内のすべてのxml子タグを再帰的にループして印刷します。
JDOMを使用してXML要素をループする別の方法を次に示します。
List<Element> nodeNodes = inputNode.getChildren();
if (nodeNodes != null) {
for (Element nodeNode : nodeNodes) {
List<Element> elements = nodeNode.getChildren(elementName);
if (elements != null) {
elements.size();
nodeNodes.removeAll(elements);
}
}