2017-01-19 25 views
-1

enter image description here Я пробовал все возможное answers на Stackoverflow, но я не могу решить эту проблему.Java Document builder возвращает null Документ для Xml String

У меня есть следующие XML в виде строки:

private static final String xmlStr = "<parameters>\n" + 
      " <parameter>\n" + 
      " <name>emp</name>\n" + 
      " <keyvalue>John Smith</keyvalue>\n" + 
      " </parameter>\n" + 
      " <parameter>\n" + 
      " <name>age</name>\n" + 
      " <keyvalue>22</keyvalue>\n" + 
      " </parameter>\n" + 
      " <parameter>\n" + 
      " <name>Birth Date</name>\n" + 
      " <keyvalue>02/05/1978</keyvalue>\n" + 
      " </parameter>\n" + 
      " <parameter>\n" + 
      " <name>password</name>\n" + 
      " <keyvalue>ye63633</keyvalue>\n" + 
      " </parameter>\n" + 
      "</parameters>"; 

Параметры могут быть заменены любой строки (который я попытался без успеха), а следующий код возвращает пустой документ:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      DocumentBuilder builder = factory.newDocumentBuilder(); 
      Document document = builder.parse(new ByteArrayInputStream(xmlStr.getBytes("UTF-8"))); 

Я попытался заменить документ:

Document document = builder.parse(new InputSource(new StringReader(xmlStr)));//This used to work 2 weeks ago. 

document все время возвращает нулевой документ, и я не могу понять, что я делаю неправильно. Тот же код использовался несколько недель назад.

Я использую Java 1.8 !!

Я обращаюсь к вам за помощью.

UPDATE:

Вот полный код, который берет выше xmlStr и пытаются получить доступ к возрасту работника.

private String getElementValue(String tagName, String xmlString) { 

     try { 

      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder builder = factory.newDocumentBuilder(); 
      Document document = builder.parse(new InputSource(new StringReader(xmlString))); 
      Element rootElement = document.getDocumentElement(); 

      NodeList list = rootElement.getElementsByTagName(tagName); 

      if (list != null && list.getLength() > 0) { 
       NodeList subList = list.item(0).getChildNodes(); 

       if (subList != null && subList.getLength() > 0) { 
        return subList.item(0).getNodeValue(); 
       } 
      } 
     } catch (ParserConfigurationException e) { 
      e.printStackTrace(); 
     } catch (SAXException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 


     return null; 
    } 

На основе замечаний, документ не является нулевым на всех, но существует проблема доступа к желаемой XML-тег. Таким образом, код NodeList list = rootElement.getElementsByTagName("age"); имеет размер 0. i.e его вообще не входит в цикл.

+0

Что * точно * вы имеете в виду под "нулевой документ"? Вы просто полагаетесь на результат 'document.toString()'? –

+0

Я отправлю точную ошибку за секунду. – WowBow

+0

Если вы могли бы переписать вопрос в качестве [mcve], который действительно помог бы ... –

ответ

1

Кажется, что он работает правильно. Следующий код, добавлен после builder.parse, показывает, что XML является разбираемый:

System.out.println("Root element: " + document.getDocumentElement().getNodeName()); 
NodeList nodeList = document.getElementsByTagName("parameter"); 
for (int temp = 0; temp < nodeList.getLength(); temp++) { 
    org.w3c.dom.Node node = nodeList.item(temp); 
    System.out.println("\nCurrent element: " + node.getNodeName()); 
    if (node.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) { 
     Element element = (Element) node; 
     System.out.println("Name: " + element.getElementsByTagName("name").item(0).getTextContent()); 
     System.out.println("Key Value: " + element.getElementsByTagName("keyvalue").item(0).getTextContent()); 
    } 
} 

Выход:

Root element: parameters 

Current element: parameter 
Name: emp 
Key Value: John Smith 

Current element: parameter 
Name: age 
Key Value: 22 

Current element: parameter 
Name: Birth Date 
Key Value: 02/05/1978 

Current element: parameter 
Name: password 
Key Value: ye63633