【问题标题】:parsing xml to java将xml解析为java
【发布时间】:2018-05-20 21:12:04
【问题描述】:

给定以下 xml 示例

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<message>
  <id>ce8140c2-14e2-418b-8150-9face6a1aa33</id>
  <company>Plostation</company>
  <content>rovetguekh</content>
</message>

每次我发现长度为零时,这是我在 java 中的代码我不知道为什么虽然消息包含我想要的所有内容,但尝试了

NodeList messageListNodes = docEle.getChildNodes();

它工作正常返回 3 但发现 java.lang.NullPointerException.getTextContent();

convertName = el.getElementsByTagName("id").item(0).getTextContent();

代码

 try {

                    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                    DocumentBuilder db = dbf.newDocumentBuilder();
                    Document dom = db.parse(new StringBufferInputStream(currentLine));
                    Element docEle = dom.getDocumentElement();
                    dom.getDocumentElement().normalize();

                    logger.info("Root element :" + dom.getDocumentElement().getNodeName());

                    /* Iterate over companies */
                    NodeList messageListNodes = docEle.getElementsByTagName("message");
                    if (messageListNodes != null) { 
                        int length = messageListNodes.getLength();                      
                        for (int i = 0; i < length; i++) {

                            Node nNode = messageListNodes.item(i);

                            if ( nNode.getNodeType() == Node.ELEMENT_NODE) {

                                Element el = (Element) nNode;

                                convertName = el.getElementsByTagName("id").item(0).getTextContent();
                                name = java.util.UUID.fromString(convertName);

                                message.setId(name);
                                message.setCompany(messageListNodes.item(1).getTextContent());
                                message.setContent(messageListNodes.item(2).getTextContent());
                                logger.debug( name+ company + content);
                                messagelist.add(message);
                            }

                        }
                    }

【问题讨论】:

  • 你的问题写得很混乱。日志输出是什么?
  • @RobinGreen 我解决了它现在可以正常工作了,谢谢你的帮助

标签: java xml xml-parsing


【解决方案1】:

问题出在 UUID 中,现在可以正常工作了

try {

                    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                    DocumentBuilder db = dbf.newDocumentBuilder();
                    Document dom = db.parse(new StringBufferInputStream(currentLine));
                    Element docEle = dom.getDocumentElement();
                    dom.getDocumentElement().normalize();

                    logger.info("Root element :" + dom.getDocumentElement().getNodeName());

                    /* Iterate over companies */
                    NodeList messageListNodes = docEle.getChildNodes();
                    if (messageListNodes != null) { 
                        int length = messageListNodes.getLength();                      
                        for (int i = 0; i < length; i++) {

                            if(messageListNodes.item(i) instanceof Element){
                                message.setId(UUID.fromString(messageListNodes.item(i).getTextContent()));
                                message.setCompany(messageListNodes.item(1).getTextContent());
                                message.setContent(messageListNodes.item(2).getTextContent());

                            }

                            logger.debug( name+ company + content);
                            messagelist.add(message);
                        }

                    }

【讨论】:

    【解决方案2】:

    由于您在根上调用getElementByTagName,而根是“消息”标签本身。这就是为什么MessageListNodes 长度为零的原因。

    您可以使用docEle.getElementsByTagName("*"); 来获取此元素(根)下的所有元素,或者您可以通过提供标签名称“id”等来做到这一点。

    删除示例工作代码供您参考。

    Message.java:

    class Message {
          final static String ID = "id", COMPANY = "company", CONTENT = "content";
          java.util.UUID id;
          String company;
          String content;
    
      public void setId(java.util.UUID id) {
         this.id = id;
      }
    
      public void setCompany(String company) {
        this.company = company;
      }
    
      public void setContent(String content) {
        this.content = content;
      }
    
      public void set(String propertyName, String value) {
        // System.out.println("Tag Name:"+propertyName+" ,value"+value);
        switch (propertyName) {
        case ID: {
            java.util.UUID name = java.util.UUID.fromString(value);
            setId(name);
            break;
        }
        case COMPANY: {
            setCompany(value);
            break;
        }
        case CONTENT: {
            setContent(value);
            break;
        }     
      }
    
      public String toString() {
        return "Message[ " + id.toString() + "," + company + "," + content + " ]";
      }
    }
    

    XmlTesting.java:

    public class XmlTestimg {
       public static void main(String[] args) {
        try {
    
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document dom = db.parse(new FileInputStream(new File("/Users/dkandalam/test.xml")));
            Element docEle = dom.getDocumentElement();
            dom.getDocumentElement().normalize();
    
            System.out.println("Root element :" + dom.getDocumentElement().getNodeName());
    
            /* Iterate over companies */
            NodeList messageListNodes = docEle.getElementsByTagName("*");
            System.out.println(messageListNodes.getLength());
            if (messageListNodes != null) {
                int length = messageListNodes.getLength();
                Message message = new Message();
                for (int i = 0; i < length; i++) {
    
                    Node nNode = messageListNodes.item(i);
    
                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element el = (Element) nNode;
                        message.set(el.getTagName(), el.getTextContent());
                        // messagelist.add(message);
                    }
                }
                System.out.println(message.toString());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
      }
    }
    

    `

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-07
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      相关资源
      最近更新 更多