1

質問をどれだけ正確にできるかわかりません。次の 2 つの質問が役立つと思います。

私は解析ファイル、特に 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) いくつかのチュートリアル/例で、ループ内からすべてのデータを表示する方法を見てきました。データを「配列された」文字列に等しく設定し、データをループの外側に表示しようとしましたが、失敗しました。要するに、後でコードで使用または渡すために、解析された 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
}
}
4

2 に答える 2

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

于 2013-02-26T15:53:06.680 に答える
0

XPath ルートを下って、XML ファイルをドキュメントに解析します。

XPath を使用して、XML ドキュメントをナビゲートできます。XPath で実現できることの詳細については、 http://www.w3schools.com/xpath/default.aspを参照 してください。

すべてがメインで行われると仮定します。

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());
}
于 2013-06-29T00:51:25.417 に答える