【问题标题】:Why I can't get the attributes from the root element using JDOM为什么我无法使用 JDOM 从根元素中获取属性
【发布时间】:2011-08-04 12:05:24
【问题描述】:

让我们考虑这个 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<root attribute="value">
    <element>myElement</element>
</root>

我正在尝试使用 JDOM 解析文件以从根元素中提取属性名称和值。

这是我为此而疯狂的代码:

public static org.jdom.Document document;
public static org.jdom.Element root;

SAXBuilder sxb = new SAXBuilder();
try
{
    document = sxb.build(new File("file.xml"));
    root = document.getRootElement();

    List myList = root.getAttributes();
    Iterator x = myList.iterator();
    while(x.hasNext())
    {
        Attribute myAttribute = (Attribute)x.next();
        System.out.println("name : " +  myAttribute.getName() + " & value : " + myAttribute.getValue());
    }
}
catch(Exception e){
    e.printStackTrace();
}

这个 xml 文件一切正常。但是当我使用这个文件时:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rootElement PUBLIC "-//Project" "mydtd.dtd">
<root attribute="value">
    <element>myElement</element>
</root>

我收到Exception in thread "main" java.lang.NullPointerException

您是否认为我应该在解析之前从 xml 文件中删除 DOCTYPE,并在完成解析后将其传递过去。

或者在这种情况下我还能做些什么?

谢谢

【问题讨论】:

  • 是什么行导致了这个空指针异常?
  • 哪里抛出异常?请提供堆栈跟踪并标记引发异常的行。
  • root = document.getRootElement();
  • @OpenMind:由于我在回答中所述的原因,该行抛出异常..

标签: java xml root jdom


【解决方案1】:

或者在这种情况下我还能做些什么?

是的 - 永远不要这样做:

catch(Exception e){}

这不是 JDOM 或属性的问题,这是您的一般异常处理的问题。

您可能会收到 NullPointerException,因为 XML 文件未正确解析,因此 document 字段为 null。但是因为您捕获并忽略了异常,所以您不会收到任何有意义的错误消息。

将您当前拥有的所有代码移到 catch 块之后,放到 try/catch 块内,您将获得更有用的错误报告。

【讨论】:

  • @OpenMind:是的,我知道,但你应该这样做,因为这就是导致你的错误的原因(NullPointerException)。您可能认为这里的异常处理无关紧要,但事实并非如此。
  • @OpenMind:看我回答的最后一句话。
  • 不要吞下来自 sxb.build 的异常;让它被扔掉,或者至少在某个地方打印出来。
  • 好的,我将代码和 xml 编辑得更具体,现在我有了 java.io.FileNotFoundException: C:\Users\Anonymous\Desktop\hello_world\mydtd.dtd (The system cannot find the file specified)
  • @OpenMind:好的,所以你的问题。要么将 DTD 文件放在那里,要么从 XML 文件中删除 DOCTYPE。
猜你喜欢
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多