Почему анализатор DOM не отображает все данные из XML-файла?

#java #xml #parsing #dom #domparser

#java #xml #синтаксический анализ #dom #domparser

Вопрос:

Я учусь писать синтаксические анализаторы на Java, теперь я пытаюсь создать анализатор DOM XML, но мой анализатор не отображает все данные из моего XML-файла. В чем проблема? Кто-нибудь может мне помочь?

Вот класс для анализатора DOM:

     public class DOMParser2 {
    private static Shoes getShoes(Node node) {
        Shoes shoes = new Shoes();
        if(node.getNodeType() == Node.ELEMENT_NODE){
            Element element = (Element) node;
            shoes.setTitle(getTagValue("ss:title", element));
            shoes.setBrand(Brand.fromValue(getTagValue("ss:brand", element)));
            shoes.setCategory(Category.fromValue(getTagValue("ss:category", element)));
            shoes.setSeason(Season.fromValue(getTagValue("ss:season", element)));
            shoes.setPrice(Double.parseDouble(getTagValue("ss:price", element)));
        }
        return shoes;
    }
    private static String getTagValue(String tag, Element element){
        NodeList nodeList = element.getElementsByTagName(tag).item(0).getChildNodes();
        Node node = (Node) nodeList.item(0);
        return node.getNodeValue();
    }
    
    public static void main(String[] args){
        String filepath = "ShoesShop.xml";
        File xmlFile = new File(filepath);
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder;
        
        try {
            builder = factory.newDocumentBuilder();
            Document document = builder.parse(xmlFile);
            document.getDocumentElement().normalize();
            System.out.print("Root element: "   document.getDocumentElement().getNodeName());
            
            NodeList nodeList = document.getElementsByTagName("ss:ShoesShop");
            
            List<Shoes> shoesList = new ArrayList<Shoes>();
            for(int i = 0; i<nodeList.getLength(); i  ){
                shoesList.add(getShoes(nodeList.item(i)));
            }
            
            for (Shoes shoes:shoesList){
                System.out.println();
                System.out.println(shoes.toString());
            } 
        } catch(Exception exc){
            exc.printStackTrace();
        }
    }
}
  

В результате я получаю это:

Корневой элемент: ss: ShoesShop [название = Baltrum, бренд = GUCCI, категория = БОТИНКИ, сезон = ОСЕНЬ, цена = 734.0]

Вот XML-файл

     <ss:ShoesShop xmlns:ss="http://www.example.org/ShoesShop" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.example.org/ShoesShop ShoesShop.xsd ">
      <ss:shoes id="1" stock="true">
        <ss:title>Baltrum</ss:title>
        <ss:brand>Gucci</ss:brand>
        <ss:category>Boots</ss:category>
        <ss:season>fall</ss:season>
        <ss:price>734.0</ss:price>
      </ss:shoes>
  <ss:shoes id="2" stock="true" mostWanted = "true">
    <ss:title>Amalfi</ss:title>
    <ss:brand>Dior</ss:brand>
    <ss:category>Mules</ss:category>
    <ss:season>winter</ss:season>
    <ss:price>364.0</ss:price>
  </ss:shoes>
</ss:ShoesShop>
  

Комментарии:

1. Ваш первый println показывает ответ. Ваш корневой элемент не назван ShoesShop , и у него нет имен элементов-потомков shoes .

2. VGR, спасибо, это помогло. Но я не могу отобразить полный список. Как я могу это изменить?

3. document.getElementsByTagName("shoes"); возвращает пустой список. Возможно, вам следует попробовать фактическое имя тега, "ss:shoes" ?

4. Я попробовал «ss: shoes», это не помогло. Когда я попробовал «ss: ShoesShop», он вернул только первую заметку из XML-файла (на самом деле их 5). Когда я меняю там значение элемента, например: NodeList NodeList = element.getElementsByTagName(tag).item(1).getChildNodes(); он отображает вторую заметку, когда item(2) отображает третью заметку и т.д. Мне нужно отобразить их все.

5. Отредактируйте свой вопрос и покажите фактический код, который вы используете.