【问题标题】:Access inner XML data with Java and Xerces使用 Java 和 Xerces 访问内部 XML 数据
【发布时间】:2011-11-16 15:09:57
【问题描述】:

我正在尝试使用 Xerces 解析 XML 文档,但我似乎无法访问元素中的数据,下面是一个示例 XML 文档;

<sample>
<block>
    <name>tom</name>
    <age>44</age>
    <car>BMW</car>
</block>
<block>
    <name>Jenny</name>
    <age>23</age>
    <car>Ford</car>
</block>
</sample>

到目前为止,我能产生的唯一输出是;

Sample
    block
      name
        age
          car
    block
      name
        age
          car

这只是节点名称的列表。我试过 node.getValue(),但这只是返回 null,所以我猜那是错误的!

如何访问里面的数据?这是到目前为止的基础知识;

public static void display(String file) {
    try{
        DOMParser parser = new DOMParser();
        parser.parse(file);
        Document doc = parser.getDocument();
        read(doc);
    }
        catch(Exception e){e.printStackTrace(System.err);}
}


public static void read(Node node) {
    if(node == null) {return;}
        int type = node.getNodeType();
        //System.out.print((node));
        switch (type) {
        case Node.DOCUMENT_NODE: {
            display_all(((Document)node).getDocumentElement());
            break;
        }

         case Node.TEXT_NODE:

          break;
        case Node.ELEMENT_NODE: {

            System.out.println(node.getNodeName());

            NodeList child = node.getChildNodes();
            if(child != null) {
                int length = child.getLength();
                for (int i = 0; i < length ; i++) {
                        display_all(child.item(i));
                }
        }

        break;


        }
        }
}

【问题讨论】:

  • getTextValue()?如果您发布一些代码会更容易。
  • 这不是一个有效的方法,我已经添加了代码,
  • getTextContent()? (输入错误)但是为什么要跳过文本节点?
  • 给予;线程“主”java.lang.AbstractMethodError 中的异常:org.apache.xerces.dom.DeferredTextImpl.getTextContent()Ljava/lang/String; TEXT_NODE 是空白的,因为我尝试的所有内容都返回 null

标签: java xml-parsing xerces


【解决方案1】:

getNodeValue() 返回您当前跳过的文本节点的值。

 public static void read(Node node) {
    if (node == null) {
        return;
    }

    int type = node.getNodeType();
    switch (type) {
    case Node.DOCUMENT_NODE: {
        System.out.println("Doc node; name: " + node.getNodeName());
        read(((Document) node).getDocumentElement());
        break;
    }

    case Node.TEXT_NODE:
        System.out.println("Text node; value: " + node.getNodeValue().replaceAll("\\s", ""));
        break;

    case Node.ELEMENT_NODE: {
        System.out.println("Element node; name: " + node.getNodeName());
        NodeList children = node.getChildNodes();
        int length = children.getLength();
        for (int i = 0; i < length; i++) {
            read(children.item(i));
        }
        break;
    }
    }
}

我认为您可能会感到困惑的地方是 XML 的实际结构,以及类似这样的子对象是什么:

<element>
  <child_element>foo</child_element>
</element>

上面的代码sn-p可能有助于解释。

这也是为什么像 dom4j、JAXB、XPath 等让事情变得更容易的原因。

【讨论】:

  • 我将如何丢失汽车元素及其文本值?我想这是我出错的地方!
  • @Lunar 我不确定你的意思;您是否正在尝试获取汽车元素及其价值?
  • @Lunar 真棒,很高兴你解决了! XML 可能很痛苦;我现在几乎只使用 XPath 类似的东西。
猜你喜欢
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多