草庐IT

java - 为什么这个 java 代码没有正确解析我的 Xml?

coder 2024-07-03 原文

我已经编写了类来将一些 xml 解析为一个对象,但它无法正常工作,当我尝试获取节点的值时,我得到的是 null 而不是节点的内容。

这是我的类的简化版本,它只对单个节点进行 xml 解析:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XmlReaderCutDown {

    private static Logger logger = Logger.getLogger(CtiButtonsXmlReader.class);

    public static void testXml(String confFile){
        DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
            Document doc = docBuilder.parse(new File(confFile));
            doc.getDocumentElement().normalize();
            if (logger.isDebugEnabled()){
                logger.debug("The root element is " + doc.getDocumentElement().getNodeName());
            }

            NodeList rows =  doc.getElementsByTagName("row");

            NodeList topRowButtons = ((Element)rows.item(0)).getElementsByTagName("button");
            logger.debug("Top row has " +topRowButtons.getLength() + " items.");
            Node buttonNode = topRowButtons.item(0);

            NodeList nodeList = ((Element)buttonNode).getElementsByTagName("id");
            logger.debug("Node list count for "+ "id" + " = " + nodeList.getLength());
            Element element = (Element)nodeList.item(0);
            String xx = element.getNodeValue();
            logger.debug(xx);
            String elementValue = ((Node)element).getNodeValue();
            if (elementValue != null) {
                elementValue = elementValue.trim();
            }
            else {
                logger.debug("Value was null");
            }
            logger.debug("Node id = "+ elementValue);

        } catch (ParserConfigurationException e) {

            logger.fatal(e.toString(),e);
        } catch (SAXException e) {
            logger.fatal(e.toString(),e);
        } catch (IOException e) {
            logger.fatal(e.toString(),e);
        } catch (Exception e) {
            logger.fatal(e.toString(),e);
        }

    }


    public static void main(String[] args){
        DOMConfigurator.configure("log4j.xml");

        testXml("test.xml");
    }
}

这是我的 xml 文件的精简版本:

<?xml version="1.0"?>
<root>
    <row>
        <button>
            <id>this is an id</id>
            <action>action</action>
            <image-src>../images/img.png</image-src>
            <alt-text>alt txt</alt-text>
            <tool-tip>Tool tip</tool-tip>
        </button>
    </row>
</root>

这是日志统计输出的内容:

DEBUG XmlReaderCutDown - 根元素是 root

DEBUG XmlReaderCutDown - 顶行有 1 个项目。

DEBUG XmlReaderCutDown - id = 1 的节点列表计数

调试 XmlReaderCutDown -

调试 XmlReaderCutDown - 值为空

调试 XmlReaderCutDown - 节点 id = null

为什么它没有获取 xml 节点中的文本?

我正在使用 JDK 1.6_10 运行

最佳答案

因为你得到的元素是文本元素的父元素,包含你需要的文本。要访问此元素的文本,您应使用 getTextContent而不是 getNodeValue。

有关详细信息,请参阅 Node 中的表格javadoc.

关于java - 为什么这个 java 代码没有正确解析我的 Xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/974709/

有关java - 为什么这个 java 代码没有正确解析我的 Xml?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  6. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  7. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  8. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  9. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  10. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

随机推荐