解析xml时如何检查空标签?

Posted

技术标签:

【中文标题】解析xml时如何检查空标签?【英文标题】:How do I check for empty tags while parsing xml? 【发布时间】:2012-05-12 00:07:40 【问题描述】:

我正在使用 Document 对象从 xml 中提取所有标签。如果 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>

所以,当我使用:

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

Nodelist 给出的长度为 1,因为有一个标签,但是当我执行 getTextContent() 时,它会命中空指针,因为 FirstChild() 没有返回任何标签 = Name

而且,我已经为每个 xml 标记做了这个。在每次提取标签之前我可以做一个简单的检查吗?

【问题讨论】:

【参考方案1】:

我要做的第一件事就是解开你的电话。这将使您有机会准确确定哪个引用为空,以及您需要对哪个引用进行空检查:

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

                 

另外,查看 Node 上的 hasChildNodes() 方法! http://docs.oracle.com/javase/1.4.2/docs/api/org/w3c/dom/Node.html#hasChildNodes%28%29

【讨论】:

很遗憾,这将是我保护代码的唯一方法。 一些python替代品?【参考方案2】:
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);
                    
                

您是否也想打印出节点的值?如果是这样,这是我示例中的一行代码,您必须添加,我也可以分享。

【讨论】:

我的回答不在乎你是否知道有多少元素。如果您想实际指定每个元素,其他一些答案可能更相关。【参考方案3】:

你尝试过类似的方法吗?

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

【讨论】:

是的,但是如果不存在 Name 类型的标签,那么 nm.item(0) 将导致空指针。

以上是关于解析xml时如何检查空标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 statx 解析器识别空 xml 标记

如何在解析之前检查 XML 中是不是存在属性和标签?

使用 Sax Parser、Java 处理 XML 中的空标签

如何调试“解析 XML 时出错:标签不匹配”?

为啥在解析 XML 时获取空节点值

如何在已解析的 XML 标记值上检查 Null