【问题标题】:Java XML Parser IssueJava XML 解析器问题
【发布时间】:2012-03-23 06:38:54
【问题描述】:

我正在尝试编写一个 xml 解析器,但在从文件中提取数据时似乎遇到了一些问题。我第一次调用 get Tag Value 时一直遇到 java Null 指针异常:

Root Element: integrity_bug_data
Getting Tage Value for: id
java.lang.NullPointerException

这是文件的样子:

<bug>
        <fields>
            <field name="ID">test</field>
            <field name="Summary"></field>
            <field name="Customer Importance">Unspecified</field>
            <field name="Development Order">Unspecified</field>
            <field name="Created Date">Mon Mar 05 03:41:46 EST 2012</field>
            <field name="Activity">Production</field>
            <field name="State">Triage</field>
            <field name="Date Closed"/>
            <field name="Date Found">Mon Mar 05 00:00:00 EST 2012</field>
            <field name="Issue Type">Software Report</field>
            <field name="Reason">Triage</field>
            <field name="Description">Subject:</field>
        </fields>
    </bug>

我已经写了(在阅读了一些教程之后):

 try{
        ArrayList<String> idData = new ArrayList<>(), sumryData = new ArrayList<>(), descpData = new ArrayList<>() ;

            //Load the XML File 
        DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
        org.w3c.dom.Document doc = docBuilder.parse(new File("./Data.xml"));

        System.out.println("Root Element: "+doc.getDocumentElement().getNodeName());

        NodeList bugList = doc.getElementsByTagName("bug");

        for (int i = 0; i < bugList.getLength(); i++){
            Node nNode = bugList.item(i);


            if(nNode.getNodeType() == Node.ELEMENT_NODE){
                Element eElement = (Element) nNode;

                idData.add(getTagValue("id",eElement));
                System.out.print("ID: "+getTagValue("id",eElement));


                String sumry = getTagValue("Summary",eElement);
                System.out.println("NodeList: "+sumry);

                String nstr = sumry.replace("\n", " ");
                String ustr = nstr.replaceAll(":", "");
                nstr = ustr.replace(",", " ");

                sumryData.add(nstr);
                System.out.print("Summary: "+nstr);


                String desc = getTagValue("Description",eElement);
                System.out.println("NodeList: "+desc);

                nstr = desc.replace("\n", " ");
                ustr = nstr.replaceAll(":", "");
                nstr = ustr.replace(",", " ");

                descpData.add(nstr);
                System.out.print("Description: "+nstr);
            }
        }

     public static String getTagValue(String tag, Element eElement){
        System.out.println("Getting Tage Value for: "+tag);
        NodeList n1List = eElement.getElementsByTagName(tag).item(0).getChildNodes();
        Node nValue = (Node) n1List.item(0);
        return nValue.getNodeValue();
    }    

这个问题可能与 &lt;field name"..."&gt;&lt;/field&gt;

,正如我为&lt;id&gt;, &lt;summary&gt; etc... 阅读的那样?

提前感谢您的帮助...

【问题讨论】:

  • 您是否尝试过 getTagValue("id",eElement) 与大写“ID”?
  • 试过了也没什么变化

标签: java xml parsing


【解决方案1】:

如果&lt;bug&gt; 不包含&lt;id&gt; 元素,或者&lt;id&gt; 标记没有子节点,就会发生这种情况。你没有在getTagValue() 中允许任何一种可能性。

【讨论】:

  • 他们都有 ...。我将如何解析?
  • 我会搜索字段然后属性就是名称吗?
【解决方案2】:

由于您还没有写出您的问题是什么,我无法为您提供您的代码。但我可以帮助解析这个 XML。我建议您使用 JAXB 进行解析。您在这里唯一需要的是创建类Bug

@XmlRootElement
public class Bug {
    private Collection<Field> fields;

    @XmlElementWrapper(name = "cars")
    @XmlElement(name = "car")    
    public Collection<Field> getFields() {
        return fields;
    }
    // other methods....
}


public class Field {
    private Sting name;
    private String text;

    @XmlAttribute
    public String getName() {
        return name;
    }
    @XmlValue
    public String getText() {
        return text;
    }

}

现在编写如下代码:

JAXBContext ctx = JAXBContext.newInstance("com.panpwr.api.model.deployment");
Unmarshaller unmarshaller = ctx.createUnmarshaller();
Data data = (Data)unmarshaller.unmarshal(in); // in is the input stream for XML
// now your instance of data is populated from XML

就是这样。你完成了。这将毫无问题地解析您的 XML。

【讨论】:

    【解决方案3】:

    看来您需要将 getTagValue 方法更改为如下内容:

    public static String getTagValue(String tag, Element eElement) {
        System.out.println("Getting Tage Value for: " + tag);
        NodeList n1List = eElement.getElementsByTagName("field");
        for (int i = 0; i < n1List.getLength(); i++) {
            Node nNode = n1List.item(i);
            if (((Element) nNode).getAttribute("name").equalsIgnoreCase(tag)) {
                return nNode.getTextContent();
            }
        }
        return null;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多