2013-02-26 1 views
1

Я не знаю, как точно задать свои вопросы. Я считаю, что два вопроса могут помочь:Проанализируйте XML в JAVA, вытащите конкретную часть данных

Я играл с файлами синтаксического анализа - в частности, xml.

Я нашел много учебников и множество приемов техники.

В большинстве учебных пособий есть простой XML-файл, который начинается с имен, телефонных номеров и т. Д.

Мои 2 вопроса:

1) как я могу извлечь/отобразить только данные между специфическим. Например, если я просто хочу, чтобы отобразить <FirstNames>, как я могу сделать (в Java) следующее:

loop 

If <tag> = “FirstName” then name_variable = data in between tags); 

or 

If <tag> = “FirstName” then System.out.printf(“ the first name is %s\n”,name_variable); 

end loop 

2) Предположим, что я ищу только второй экземпляр First Name, в некоторых учебники/примеры, которые я видели, как отображать все данные из цикла. Я попытался установить данные равными «массивной» строке, а затем отобразить данные вне цикла, но вычеркнул. В нижней части, как вы храните индексированный (массив) фрагмент проанализированных XML-данных для использования или передачи в более позднем коде?

<company> 
<Name>My Company</Name> 
<Executive type = "CEO"> 
    <LastName>Smith</LastName> 
    <FirstName>Jim</FirstName> 
    <street>123 Main Street</street> 
    <city>Mytown</city> 
    <state>TN</state> 
    <zip>11234</zip> 
</Executive> 
<Executive type = "OEC"> 
    <LastName>Jones</LastName> 
    <FirstName>John</FirstName> 
    <street>456 Main Street</street> 
    <city>Gotham</city> 
    <state>TN</state> 
    <zip>11234</zip> 
</Executive> 
</company> 

Вот код, я кусочки, я получаю некоторые данные из моего XML, но я не понял, как хранить в индексируемой части проанализированных данных.

package dom_parsing_in_java; 
import org.w3c.dom.*; 
import javax.xml.parsers.*; 
import java.io.*; 
import org.w3c.dom.NodeList; 
import org.w3c.dom.Node; 
import org.w3c.dom.NamedNodeMap; 
//import com.sun.org.apache.xerces.internal.parsers.DOMParser; 

public class DOM_Parsing_In_JAVA { 

    public static void main(String[] args) { 
    // TODO code application logic here 
    String file = "test2.xml"; 

if(args.length >0){ 
    file = args[0]; 

}// end If 

try{ 
    //DOMParser parser= new DOMParser(); 
    DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document document = builder.parse(new File(file)); 

    //Document document = parser.getDocument(); 

    Element root = document.getDocumentElement(); 
    System.out.println(root.getTagName()); 

    NodeList node_list = root.getElementsByTagName("Executive"); 


    //Node comp = getNode("Company",root); 

    int i; 


    for(i = 0; i<node_list.getLength();i++){ 
     Element department = (Element)node_list.item(i); 

     System.out.println(department.getTagName()); 
     System.out.println("name "+document.getElementsByTagName("Name").item(0).getTextContent()); 
     System.out.println("name "+document.getElementsByTagName("FirstName").item(i).getTextContent()); 
     System.out.printf(" Lastname: %s%n ", document.getElementsByTagName("LastName").item(i)); 
     System.out.printf(" Lastname: %s%n ", department.getAttribute("LastName")); 
     System.out.printf(" FirstName: %s%n",department.getAttribute("FirstName")); 
     //System.out.printf(" elements by Tag %s%n",department.getElementsByTagName("testTag")); 
     //System.out.printf(" staff: %s%n",countStaff(department)); 
    } 

} 
catch(Exception e){ 
    e.printStackTrace(); 

}//end catch 
} 
} 

ответ

0

Посмотрите на StAX API: http://docs.oracle.com/javase/tutorial/jaxp/stax/why.html

(Вы, вероятно, хотите использовать его "итератор/событие API": http://docs.oracle.com/javase/tutorial/jaxp/stax/api.html)

Вот пример: http://docs.oracle.com/javase/tutorial/jaxp/stax/example.html#bnbfz

+0

Я провел прошлую ночь (слишком поздно прошлой ночью), разочаровавшись в попытках работать с примерами StAX и немного почитать. Пристойный уровень разочарования сидел прошлой ночью. Я неуклонно искал в Интернете инструкции по разбору XML в JAVA. Моя конечная цель, я думаю, довольно проста - извлечь и сохранить в переменной конкретную часть «помеченных» XML-данных и использовать ее в другом месте. На прошлой неделе я стал очень близко использовать DOM, но не смог получить данные, сохраненные и переданные в другую часть. Я мог отобразить его и почувствовал, что я почти там. Я мог бы использовать некоторые дополнительные советы и указания. – user638361

+0

Я читал и работал по упомянутым ссылкам. Я чувствую себя как примеры, упомянутые в http://docs.oracle.com/javase/tutorial/jaxp/stax/example.html # bnbfz ​​ Предположим, что уровень владения JAVA определен невелик - кажется, что примеры дают snip-его и частичные фрагменты кода, а оставшийся код должен быть очевиден. Я мог бы использовать некоторые дополнительные советы и указания. Благодаря! – user638361

0

Я бы спустил маршрут XPath и проанализировал XML-файл в документе.

XPaths можно использовать для навигации по XML-документу. См. http://www.w3schools.com/xpath/default.asp для получения дополнительной информации о том, что вы можете достичь с помощью XPaths.

Предполагая, что все это делается в основном:

public static void main(String[] args) { 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document doc = builder.parse(new File("file.xml")); 
    XPathFactory xPathfactory = XPathFactory.newInstance(); 
    XPath xpath = xPathfactory.newXPath(); 
    XPathExpression firstnameExpr = xpath.compile("//FirstName"); 

    NodeList nl = (NodeList) firstnameExpr.evaluate(doc, XPathConstants.NODESET); 

    for (int i=0; i<nl.getLength(); i++) { 
     Node node = nl.item(i); 

     // this is assuming the first child of Firstname is the characters (contents) 
     // of the Firstname tag, you may need to do some checking whether or not 
     // node.getNodeType() == Node.Text; 
     System.out.println("Firstname["+i+"] = " 
           + node.getChildNodes()[0].getTextContent()); 
    } 


} 

Вместо печати первого содержимого имен в System.out можно добавить значения в ArrayList, который будет поддерживать порядок, а именно:

List<String> firstnameList = new ArrayList<String>(); 

for (int i=0; i<nl.getLength(); i++) { 
    Node node = nl.item(i); 

    // again, you might want to check that .getChildNodes() doesn't return null 
    // and that it is of type Node.Text 
    firstnameList.add(node.getChildNodes()[0].getTextContent()); 
} 
Смежные вопросы