2012-03-05 83 views
-2

我正在尝试编写一个xml解析器,但在从文件中提取数据时似乎遇到了一些问题。我一直运行到,在我第一次调用Java空指针异常获取标记值:Java XML解析器问题

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(); 
    }  

难道这个问题与该 <field name"..."></field>

,假设我正在阅读<id>, <summary> etc...

在此先感谢您的帮助...

+1

问题是什么? – Overv 2012-03-05 19:24:46

+0

sry我更新了它 – Shahab 2012-03-05 19:26:24

+0

您是否尝试过使用大写“ID”的getTagValue(“id”,eElement)? – dyrkin 2012-03-05 19:30:37

回答

1

看起来你需要改变你的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; 
} 
+0

雅感谢,我需要的属性! – Shahab 2012-03-05 20:23:37

1

如果<bug>不含<id>元素就会发生这种情况,或者如果<id>标签没有子节点。您在getTagValue()中不允许有任何可能性。

+0

以及它们都有 ...。我将如何解析? – Shahab 2012-03-05 19:36:08

+0

我会搜索字段,然后属性将是名称? – Shahab 2012-03-05 20:02:23

1

既然你还没有写你的问题是什么,我不能帮你用你的代码。但我可以帮助解析这个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没有任何问题。