8

我有一个 XML 文件,其中一些子标签(子节点元素)是可选的。例如

<part>
   <note>
       </rest>
   </note>

   <note>
       <pitch></pitch>
   </note>

   <note>
       <pitch></pitch>
   </note>
</part>

但是当我通过标签读取 XML 文件时,它会抛出 NullPointerException - 因为某些子标签是可选的(例如,上面示例中的 rest 和 pitch)。我怎样才能过滤掉这个?我找不到任何方法来查找特定标签名称是否存在元素。即使我有一个条件来检查 getElementsByTagName("tag-name") 方法是否不返回 NULL - 它仍然进入条件主体并且显然抛出异常。我该如何解决这个问题?

java代码是:

if(fstelm_Note.getElementsByTagName("rest")!=null){
    if(fstelm_Note.getElementsByTagName("rest")==null){
        break;
    }
    NodeList restElmLst = fstelm_Note.getElementsByTagName("rest");
    Element restElm = (Element)restElmLst.item(0);
    NodeList rest = restElm.getChildNodes();

    String restVal = ((Node)rest.item(0)).getNodeValue().toString();

}else if(fstelm_Note.getElementsByTagName("note")!=null){
    if(fstelm_Note.getElementsByTagName("note")==null){
        break;
    }

    NodeList noteElmLst = fstelm_Note.getElementsByTagName("note");
    Element noteElm = (Element)noteElmLst.item(0);

    NodeList note = noteElm.getChildNodes();
    String noteVal = ((Node)note.item(0)).getNodeValue().toString();
}

任何见解或建议表示赞赏。提前致谢。

4

5 回答 5

13

我遇到了同样的问题(使用 getElementsByTagName() 在 XML 文件中获取“可选”节点),所以我可以通过经验告诉我如何解决它。事实证明,当没有找到匹配的节点时,getElementsByTagName不会返回 null ;相反,它返回一个零长度的 NodeList 对象。

正如您可能猜到的,在尝试获取其内容之前检查节点是否存在于 XML 文件中的正确方法类似于:

NodeList nl = element.getElementsByTagName("myTag");
if (nl.getLength() > 0) {
    value = nl.item(0).getTextContent();
}

确保指定一个“默认”值,以防永远找不到标签。

于 2013-11-04T16:18:04.787 回答
1

您的要求非常不清楚,但我很可能会使用该包使用XML Path Language (XPath)javax.xml.xpath解析您的 XML 文档。

看一下:

但是你应该试着解释你试图解决的一般问题,而不是你面临的具体问题。但是这样做,1. 你可能会得到更好的答案,2. 当前选择的路径可能不是最好的。

于 2010-07-10T03:03:49.300 回答
1

您的 NodeList 可能不为空,而是为空。你能试着像这样改变你的代码,看看会发生什么吗?

NodeList restElmLst = fstelm_Note.getElementsByTagName("rest");
if (restElmLst != null && !restElmLst.isEmpty())
{
    Element restElm = (Element)rests.item(0);
...

等(双重检查语法等,因为我不在编译器前面。)

于 2010-07-10T02:21:07.363 回答
0

试试下面的东西

bool hasCity = OrderXml.Elements("City").Any();

其中 OrderXml 是父元素。

于 2015-06-11T06:08:34.213 回答
0

首先你需要创建nodelist然后检查长度nodelist来检查当前元素是否存在于xml字符串中。

NodeList restElmLst = fstelm_Note.getElementsByTagName("rest");

if (restElmLst.getLength() > 0) {
    String restVal = restElm.getElementsByTagName("rest").item(0).getTextContent(); 
}                               
于 2017-08-03T04:28:09.333 回答