#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. Отредактируйте свой вопрос и покажите фактический код, который вы используете.