使用Java DOM解析XML为何无法获取到name属性值?
先把你的测试代码贴出来方便分析:
@Test public void testDolaAmeng() throws Exception { DocumentBuilderFactory dy = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dy.newDocumentBuilder(); File f = new File("E:/JavaApps/day02/src/_05XML/connect.xml"); Document dc = db.parse(f); NodeList nl = dc.getElementsByTagName("linkman"); Element et = (Element) nl.item(1); String name1 = et.getAttribute("name"); System.out.println(name1); //未获取到任何内容..... // Element son1 =(Element)et.getElementsByTagName("name").item(0); // String... }
我帮你梳理几个最可能导致无输出的原因,你可以逐一排查:
索引错误或
元素数量不足 :NodeList的索引是从0开始的!你用nl.item(1)获取的是第二个元素,但如果你的XML文件里只有1个 ,这个方法会返回 null。如果后续调用getAttribute("name"),理论上会抛出NullPointerException,但要是你没注意到JUnit测试失败(比如只看控制台没看测试结果面板),就会误以为是无输出。先检查XML里的数量,要是只有1个,改成 nl.item(0)试试。XML文件路径不正确:你用的是绝对路径,先确认这个路径下真的存在
connect.xml文件!如果文件不存在,db.parse(f)会抛出IO异常,而你的方法直接throws Exception,JUnit会直接标记测试失败,根本走不到System.out.println那一步,自然没有输出。可以在db.parse(f)前加一行调试代码:System.out.println(f.exists());,看看输出是true还是false,要是false,赶紧修正文件路径。混淆了属性和子元素:看你注释掉的代码,你似乎尝试过获取
子元素?会不会你的XML里, 的名称不是以属性形式存在,而是子元素?比如XML结构是这样的: <linkman> <name>张三</name> </linkman>而不是
<linkman name="张三"/>?如果是前者,getAttribute("name")会拿到空字符串,所以控制台没有有效输出。这时候就需要用你注释里的方式,先获取子元素再取文本内容:Element son1 = (Element) et.getElementsByTagName("name").item(0); String name1 = son1.getTextContent();JUnit测试未正确执行:先确认你的
@Test注解是否正确导入——JUnit4是org.junit.Test,JUnit5是org.junit.jupiter.api.Test。如果注解不对,这个方法不会被JUnit识别为测试用例,自然不会执行也没有输出。另外有些IDE默认会隐藏JUnit的控制台输出,你可以去IDE设置里检查,比如IntelliJ要确保「Show console when running tests」选项是勾选状态。
内容的提问来源于stack exchange,提问作者li stephen

