Каким образом можно по тексту тегов, которые внутри тега отцовского, узнать какому именно отцу он пренадлежит и выдать все значение внутри отца по одному из этих значений методом SAX?
DOM методом и XPATH уже обрабатывал, нужна помощь именно с SAX.
Ну грубо говоря, пользователь должен ввести Product1
, а ему должно выдастся: Product1
пренадлежит тегу id
внутри тега product
и должeн выдастся спискок тип "значения этого тега"("Id", "Name", "Price")+ его значение, ну и как-бы полностю пролистать все что внутри продукта и выдать. Ну это всего лишь пример там должно быть чтоб оно не привзывалсь не к каким-то статчным именам а програма адекватно реагировала на смену всех тегов и добавления новых. Реализовал уже поиск по атрибутам:
DefaultHandler handler=new DefaultHandler(){
public void startElement(String uri, String localName, String qName, Attributes attributes)throws SAXException {
super.startElement(uri, localName, qName, attributes);
String name= attributes.getValue(textField.getText());
if(name!=null && !name.isEmpty()){
System.out.println(name);
}
}
public void characters(char[] ch, int start, int length) throws SAXException{
String str="";
for(int i=0; i<length; i++){
str+=ch[start+i];
}if(textField.getText().equals("all")){
System.out.println(str);}
}
};
SAXParserFactory factory= SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
parser.parse(new File("src\\data\\products.xml"), handler);
Данные:
<products>
<product name="eee" price="122">
<id>p01</id>
<name>Product1</name>
<price>100</price>
</product>
<product name="pp" price="123">
<id>p02</id>
<name>Product2</name>
<price>200</price>
</product>
<product name="rr" price="124">
<id>p03</id>
<name>Product3</name>
<price>300</price>
</product>
<product name="rrr" price="125">
<id>p04</id>
<name>Product4</name>
<price>400</price>
</product>
import java.io.IOException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXHandler extends DefaultHandler {
private final String query;
private String currentTagName;
private Product currentProduct;
private static class Product {
private String id;
private String name;
private int price;
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setPrice(String price) {
this.price = Integer.parseInt(price);
}
public int getPrice() {
return price;
}
public String toString() {
return String.format("Id: %s\nName: %s\nPrice: %d\n", id, name, price);
}
}
public SAXHandler(String query) {
this.query = query;
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
currentTagName = qName;
if(qName.equals("product")) {
currentProduct = new Product();
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(qName.equals("product")) {
if (query.equals(currentProduct.getName()))
System.out.println(currentProduct);
currentProduct = null;
}
currentTagName = null;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(currentProduct == null)
return;
String tagContent = new String(ch, start, length).trim();
if ("id".equals(currentTagName))
currentProduct.setId(tagContent);
if ("name".equals(currentTagName))
currentProduct.setName(tagContent);
if ("price".equals(currentTagName))
currentProduct.setPrice(tagContent);
}
public static void main(final String args[]) {
if (args.length < 1) {
System.err.println("Введите имя искомого продукта");
return;
}
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
SAXHandler handler = new SAXHandler(args[0]);
saxParser.parse("test.xml", handler);
}
catch(SAXException ex) {}
catch(ParserConfigurationException ex) {}
catch(IOException ex) {}
}
}
Единственный способ определить родителя при использовании SAX -- сохранить иерархию тегов в процессе чтения документа. Возможно, для Вашей задачи больше подойдет DOM-парзер (см. DocumentBuilderFactory
и DocumentBuilder
).
Получаю ответ от API OpenWeatherMapКаким образом можно было бы получить код ответа и в зависимости от него отобразить контент? К примеру, если статус...
Как мне передать картинку через массив? Имеется массив Const LocalStorage = [ { Id: 1, Name: "one" … } … ]