Возвращаемые значения из xml, xml Итерация - PullRequest
1 голос
/ 23 апреля 2020

У меня есть xml файл как таковой

<?xml version="1.0" encoding="UTF-8"?>
<folder name="c">
  <folder name="program files"> 
      <folder name="uninstall information" />
  </folder>
  <folder name="users"/>
</folder>

Я хочу распечатать "c", "программные файлы", "удалить информацию" и "пользователи", что я, наконец, хочу do - распечатывать только значения атрибута name со строкой, начинающейся с u, следовательно, информацию о пользователях и unallall. Но я не смог распечатать все значения. Ниже приведен мой код, который показывает, что я пытался найти способы, но пока безуспешно.

  public static Collection<String> folderNames(String xml, char startingLetter) throws Exception {
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            FileInputStream fis = new FileInputStream("src/main/resources/test.xml");
            org.xml.sax.InputSource is = new InputSource(fis);
            Document doc = documentBuilder.parse(is);
            NodeList nodeList = doc.getElementsByTagName("*");
            for(int i =0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
 /// Tried this
                if(node.getNodeType() == Node.ELEMENT_NODE) {
                    String value = node.getTextContent();
                    System.out.println("value:::" +value);
                }
/// tried this
//                Element element = (Element)nodeList.item(i);
//                NamedNodeMap attributes = element.getAttributes();
//                     Node nodeValue1 = nodeList.item(i);
//                    System.out.println(nodeValue1.getAttributes().item(i));
            }
         } catch (Exception e) {
            e.getMessage();
        }
        return Collections.EMPTY_LIST;
     }

для быстрого теста мои импортированные классы выглядят как тест

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

Мой подход без использования getElementByTagsName

 Document doc = documentBuilder.parse(is);
            NodeList nodeList = doc.getElementsByTagName("folder");
            for(int i =0; i < nodeList.getLength(); i++) {
               if (nodeList.item(i).hasChildNodes()) {
               for(int i1 = 0; i1 < nodeList.item(i).getChildNodes().getLength(); i1++) {
                   Node node = nodeList.item(i).getChildNodes().item(i);
                   System.out.println(node.getAttributes().item(i));
                   }
               }
                Node nodeValue1 = nodeList.item(i);
                System.out.println(nodeValue1.getAttributes().item(i));

Это не завершено, но для него потребуется рекурсивный вызов из-за иерархии в xml

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

У тебя почти было это. Сначала вы должны идентифицировать элемент XML, который вы сделали.

        if(node.getNodeType() == Node.ELEMENT_NODE) {
            String value = node.getTextContent();
            System.out.println("value:::" +value);
        }

, но вместо того, чтобы вызывать getTextContent (), вам нужно найти атрибут в этом элементе. Некоторые вариации ниже. Конечно, если имеется более одного атрибута, вам нужно будет рассмотреть их все (используя node.getAttributes (). GetLength ()):

            if(node.getNodeType() == Node.ELEMENT_NODE) {
                if (node.getAttributes() != null) {
                    String name = node.getAttributes().item(0).getNodeName();
                    String value = node.getAttributes().item(0).getNodeValue();
                    System.out.println("attribute name:::" +name + "   value:::" +value);
                }
            }
1 голос
/ 23 апреля 2020

Пример печати всех имен папок, начинающихся с u:

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
             "<folder name=\"c\">\n" + 
             "  <folder name=\"program files\">\n" + 
             "      <folder name=\"uninstall information\" />\n" + 
             "  </folder>\n" + 
             "  <folder name=\"users\"/>\n" + 
             "</folder>";
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(new InputSource(new StringReader(xml)));
NodeList nodeList = doc.getElementsByTagName("folder");
for (int i = 0; i < nodeList.getLength(); i++) {
    Element element = (Element) nodeList.item(i);
    String name = element.getAttribute("name");
    if (name.startsWith("u"))
        System.out.println(name);
}

Вывод

uninstall information
users
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...