2012-05-02 2 views
3

Document 객체를 사용하여 XML에서 모든 태그를 추출하고 있습니다. xml에 빈 태그가 있으면 null 포인터 예외가 발생합니다. 어떻게이 일을 막을 수 있습니까? 빈 태그를 확인하려면 어떻게합니까?xml을 구문 분석하는 동안 빈 태그를 확인하려면 어떻게해야합니까?

<USTrade> 
<CreditorId> 
<CustomerNumber>xxxx</CustomerNumber> 
<Name></Name> 
<Industry code="FY" description="Factor"/> 
</CreditorId> 
<DateReported format="MM/CCYY">02/2012</DateReported> 
<AccountNumber>54000</AccountNumber> 
<HighCreditAmount>0000299</HighCreditAmount> 
<BalanceAmount>0000069</BalanceAmount> 
<PastDueAmount>0000069</PastDueAmount> 
<PortfolioType code="O" description="Open Account (30, 60, or 90 day account)"/> 
<Status code="5" description="120 Dys or More PDue"/> 
<Narratives> 
<Narrative code="GS" description="Medical"/> 
<Narrative code="CZ" description="Collection Account"/> 
</Narratives> 
</USTrade> 
<USTrade> 

그래서, 내가 사용하는 경우 :이 태그입니다,하지만 난 getTextContent()를 수행 할 때, 그것은 FirstChild 때문에 널 포인터를 명중하기 때문에

   NodeList nm = docElement.getElementsByTagName("Name"); 
       if (nm.getLength() > 0) 
        name = nullIfBlank(((Element) nm.item(0)) 
          .getFirstChild().getTextContent()); 

노드 목록 1의 길이) (제공 tag = Name에 대해 아무것도 반환하지 않습니다.

그리고 각 xml 태그에 대해이 작업을 수행했습니다. 모든 태그를 추출하기 전에 할 수있는 간단한 체크가 있습니까?

답변

6

내가해야 할 일은 전화를 끊는 것입니다. 이 널 (null) 인 참조하면 정확하게 판단 할 수있는 기회를주고 당신이 널 체크를 할 필요가 참조하는 것 또한

NodeList nm = docElement.getElementsByTagName("Name"); 
       if (nm.getLength() > 0) { 
        Node n = nm.item(0); 
        Node child = n.getFirstChild(); 
        if(child == null) { 
         // null handling 
         name = null; 
        } 
        else { 
         name = nullIfBlank(child.getTextContent()); 
        } 

       } 

를 노드에 hasChildNodes() 방법을 확인! http://docs.oracle.com/javase/1.4.2/docs/api/org/w3c/dom/Node.html#hasChildNodes%28%29

+0

불행하게도, 이것이 코드를 보호 할 수있는 유일한 방법 일 것입니다. – roymustang86

+0

일부 파이썬 대안? – user2925795

0
while(current != null){ 
       if(current.getNodeType() == Node.ELEMENT_NODE){ 
        String nodeName = current.getNodeName(); 
        System.out.println("\tNode: "+nodeName); 
        NamedNodeMap attributes = current.getAttributes(); 
        System.out.println("\t\tNumber of Attributes: "+attributes.getLength()); 
        for(int i=0; i<attributes.getLength(); i++){ 
         Node attr = attributes.item(i); 
         String attName = attr.getNodeName(); 
         String attValue= attr.getNodeValue(); 
         System.out.println("\t\tAttribute Name: "+ attName+ "\tAttribute Value:"+ attValue); 
        } 
       } 

노드의 값을 출력하고 싶습니까? 그렇다면, 필자가 추가해야 할 코드는 한 줄의 코드이며,이를 공유 할 수도 있습니다.

+0

내 대답은 얼마나 많은 요소가 있는지 알면 상관이 없습니다. 실제로 각 요소를 지정하려면 다른 답변 중 일부가 더 적절할 수 있습니다. – Chad

0

그런 시도를 했습니까?

NodeList nm = docElement.getElementsByTagName("Name"); 
if ((Element) nm.item(0)) 
name = nullIfBlank(((Element) nm.item(0)).getFirstChild().getTextContent()); 
+0

예, Name 유형의 태그가 없으면 nm.item (0)은 널 포인터가됩니다. – roymustang86

+0

@ roymustang86 편집 살펴보기 – DonCallisto

관련 문제