4

Xmlドキュメントを解析し、値をテキストファイルに保存する必要があります。通常のデータを解析している場合(すべてのタグにデータがある場合)は正常に機能しますが、タグにデータがない場合は、必要なものを「NullpointerException」としてスローします。 nullポインターの例外を回避するために、サンプルコードを使用して提案してください。サンプルxml:

<company>
    <staff>
        <firstname>John</firstname>
        <lastname>Kaith</lastname>
        <nickname>Jho</nickname>
        <Department>Sales Manager</Department>
    </staff>
    <staff>
        <firstname>Sharon</firstname>
        <lastname>Eunis</lastname>
        <nickname></nickname>
        <Department></Department>
    </staff>
    <staff>
        <firstname>Shiny</firstname>
        <lastname>mack</lastname>
        <nickname></nickname>
        <Department>SAP Consulting</Department>
    </staff>
</company>

コード:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

public class ReadXMLFile {

    public static void main(String argv[]) {

      try {

        File fXmlFile = new File("c:\\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("staff");
        System.out.println("-----------------------");

        for (int temp = 0; temp < nList.getLength(); temp++) {

           Node nNode = nList.item(temp);
           if (nNode.getNodeType() == Node.ELEMENT_NODE) {

              Element eElement = (Element) nNode;

              System.out.println("First Name : " + getTagValue("firstname", eElement));
              System.out.println("Last Name : " + getTagValue("lastname", eElement));
                  System.out.println("Nick Name : " + getTagValue("nickname", eElement));
              System.out.println("Salary : " + getTagValue("Department", eElement));

           }
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
  }

  private static String getTagValue(String sTag, Element eElement) {
    NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();

        Node nValue = (Node) nlList.item(0);

    return nValue.getNodeValue();
  }

}
4

4 に答える 4

4

オブジェクトが次のものではないことを確認してくださいnull

private static String getTagValue(String tag, Element eElement) {
    NodeList nlList = eElement.getElementsByTagName(tag).item(0).getChildNodes();
    Node nValue = (Node) nlList.item(0);
    if(nValue == null) 
        return null;
    return nValue.getNodeValue();
}

String salary = getTagValue("Department", eElement);
if(salary != null) {
    System.out.println("Salary : " + getTagValue("Department", eElement));
}
于 2012-08-06T12:48:58.007 に答える
1
NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();

上記の行は、指定されたタグ名を持つ要素の子ノードを取得します。この要素にデータがない場合、返されるノードリストは空です。

Node nValue = (Node) nlList.item(0);

上記の行は、空のノードリストから最初の要素を取得します。リストが空であるため、0は無効なインデックスであり、ドキュメントによると、nullが返されます

return nValue.getNodeValue();

したがって、上記の行はnull変数のメソッドを呼び出し、NPEを引き起こします。

リストが空かどうかをテストし、必要な場合は必要なもの(たとえば、空の文字列)を返す必要があります。

if (nList.getLength() == 0) {
    return "";
}
Node nValue = (Node) nlList.item(0);
return nValue.getNodeValue();
于 2012-08-06T12:52:47.770 に答える
0

交換

System.out.println("First Name : " + getTagValue("firstname", eElement));

System.out.println("First Name : " + getTagValue("firstname", eElement) == null?"":getTagValue("firstname", eElement));

他のタグについても同じです。

于 2012-08-06T12:51:32.287 に答える
0

このコードは機能するはずです:

// getNode function
private static String getNode(String sTag, Element eElement) {
    //if sTag exists(not null) I get childNodes->nlList
    if (eElement.getElementsByTagName(sTag).item(0)!=null){
        NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
        //check if child (nlList) contain something
        if ((nlList.getLength() == 0))//if the content is null
            return "";
        //if child contains something extract the value of the first element
        Node nValue = (Node) nlList.item(0);
            return nValue.getNodeValue();
    }
    return "";
}
于 2014-09-06T20:27:49.667 に答える