2014-07-23 2 views
0

Это мой текущий файл XML, он дает мне диалог для разных персонажей или, по крайней мере, должен. Я хочу, чтобы он работал, чтобы я мог указать идентификатор объекта и идентификатор опции/квеста и получить результат. И что же мне делать? Любая помощь приветствуется, большое вам спасибо.Как читать XML по его идентификаторам элемента?

<?xml version="1.0"?> 
<dialoge> 
<entity id="1"> <!-- questgiver --> 
    <quest id="1"> 
     <option id="1"> 
      <precondition>player has not started quest</precondition> 
      <output>hello there, can you kill 2 enemies for me?</output> 
     </option> 
     <option id="2"> 
      <precondition>player has completed quest and player has not...</precondition> 
      <output>thankyou, have a sword for your troubles.</output> 
     </option> 
     <option id="3"> 
      <precondition>player has not finished quest</precondition> 
      <output>you haven't finished yet.</output> 
     </option> 
     <option id="4"> 
      <outpur>thank you.</outpur> 
     </option> 
    </quest> 
</entity> 
<entity id="2"> <!-- villager --> 
    <option id="1"> 
     <precondition>village is being destroyed</precondition> 
     <output>our village is being destroyed, please help us!</output> 
    </option> 
    <option id="2"> 
     <precondition>village has been saved or destroyed</precondition> 
     <output>we will never forget this.</output> 
    </option> 
    <option id="3"> 
     <output>hello.</output> 
    </option> 
</entity> 
</dialoge> 

Это то, что у меня есть сейчас, но оно не работает. Я знаю, что это, наверное, глупый вопрос, но я не мог найти ответ нигде в Интернете. Благодарю.

public static void read() { 
    try { 
     File file = new File("text.xml"); 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(file); 
     doc.getDocumentElement().normalize(); 

     System.out.println("root of xml file " + doc.getDocumentElement().getNodeName()); 
     NodeList nodes = doc.getElementsByTagName("entity"); 
     System.out.println("=========================="); 

     for(int i = 0; i < nodes.getLength(); i++) { 
      Node node = nodes.item(i); 
      if(node.getNodeType() == Node.ELEMENT_NODE) { 
       Element element = (Element) node; 
         if(element.getElementsByTagName("entity").item(0).getTextContent().equals("output")) { 

       } 
       System.out.println("" + getValue("output", element)); 
      } 
     } 
    }catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

private static String getValue(String tag, Element element) { 
    NodeList nodes = element.getElementsByTagName(tag).item(0).getChildNodes(); 
    Node node = (Node) nodes.item(0); 
    return node.getNodeValue(); 
} 

ответ

2

метод Простейшее может быть использование XPath ...

try { 
    File file = new File("text.xml"); 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document doc = db.parse(file); 
    doc.getDocumentElement().normalize(); 

    XPath xpath = XPathFactory.newInstance().newXPath(); 
    XPathExpression xExpress = xpath.compile("//*[@id='1']"); 
    NodeList nl = (NodeList) xExpress.evaluate(doc, XPathConstants.NODESET); 
    System.out.println("Found " + nl.getLength() + " matches"); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

XPath запрос //*[@id='1'] найдет все узлы в документе, которые имеют атрибут id со значением 1

Have a WC3 XPath Tutorial и How XPath works для получения более подробной информации о XPath

+0

, если я хочу, чтобы найти только для 'entity' тега? :) – Braj

+0

'// entity [@ id = '1']' или '// entity', если вы хотите, чтобы все сущности независимо от значения id – MadProgrammer

+0

Увидев, что мой XML-файл имеет два разных элемента с идентификатором, и оба они имеют дочерние элементы, которые также имеют идентификаторы, как мне их найти? Я бы сделал entity [@ id = '1'], а затем option [@ id = '1']? Спасибо, и это кажется хорошим решением. –

1

В целом, DOM проще в использовании, но имеет накладные расходы при анализе entire XML, прежде чем вы сможете начать использовать его, когда SAX parser анализирует XML и встречает запуск тега (например, <something>), то он вызывает событие startElement (фактическое название события может отличаться). read more..

См Java Учебник на Parsing an XML File Using SAX

Вот код образца:

import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

public class GetElementAttributesInSAXXMLParsing extends DefaultHandler { 

    public static void main(String[] args) throws Exception { 
     DefaultHandler handler = new GetElementAttributesInSAXXMLParsing(); 
     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     factory.setValidating(false); 
     SAXParser parser = factory.newSAXParser(); 
     parser.parse(new File("text.xml"), handler);  
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, Attributes attributes) 
      throws SAXException { 

     System.out.println("Tag Name:"+qName); 
     // get the number of attributes in the list 
     int length = attributes.getLength(); 

     // process each attribute 
     for (int i = 0; i < length; i++) { 

      // get qualified (prefixed) name by index 
      String name = attributes.getQName(i); 
      System.out.println("Attribute Name:" + name); 

      // get attribute's value by index. 
      String value = attributes.getValue(i); 
      System.out.println("Attribute Value:" + value); 
     } 
    } 
} 
+0

Благодарим за сообщение об этом, это очень полезно, но я запутался в startElement(), в том, что я прочитал, похоже, он будет вызван автоматически, как это происходит ? Также каковы переменные, относящиеся к String uri, String localName ... и т. Д. Спасибо за помощь. –

+0

@ user3053027 Он известен как шаблон посетителя. Парсер сакса автоматически вызовет методы обработчика в ответ на изменения при чтении XML-документа. Этот подход действительно хорош, если вы хотите только разобрать документ один раз, от начала до конца. Если вы хотите соответственно запросить документ, вам нужно будет использовать подход DOM, который позволит вам перейти в документ, где бы вы ни находились, двигаться в любом направлении и выполнять повторяющиеся запросы ... – MadProgrammer

Смежные вопросы