1

私はこのxmlファイルを持っています

<Cdtr>
    <Nm>DEF Electronics</Nm>
    <PstlAdr>
        <AdrLine>Corn Exchange 5th Floor</AdrLine>
        <AdrLine>Mark Lane 55</AdrLine>
        <AdrLine>EC3R7NE London</AdrLine>
        <AdrLine>GB</AdrLine>
    </PstlAdr>
</Cdtr>

Javaでdomパーサーを使用して、xmlを解析し、リーフタグ名(値を持つ)とそれぞれの値を取得しようとしています。以下は、私がそのために使用しているコードです。

public class GetNodeValues {

  public static void main(String[] args) {

    try {

   String xmlFile = "C:/Users/Administrator/workspace/sample.xml";
   File file = new File(xmlFile);
   if(file.exists()){
   // Create a factory
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   // Use the factory to create a builder
   DocumentBuilder builder = factory.newDocumentBuilder();
   Document doc = builder.parse(xmlFile);
   doc.getDocumentElement().normalize();
   // Get a list of all elements in the document
   NodeList list = doc.getElementsByTagName("*");
   System.out.println("XML Elements: ");


   for (int i=0; i<list.getLength(); i++) {
     // Get element
    Element element = (Element)list.item(i);
    String nodnam = element.getNodeName();
    NodeList nl = doc.getElementsByTagName(nodnam);
    Element ele = (Element) nl.item(0);
    if (ele.getChildNodes().getLength() > 0) // then it has text

          String val = ele.getChildNodes().item(0).getNodeValue();
          if (val.startsWith("\n")) {         //Discarding pseudo nodes
          }else {
        System.out.println("Node: "+nodnam+" | Val: "+val); //print node names and values
          }
         }
   }
}
else{
   System.out.print("File not found!");
}
}
catch (Exception e) {
  System.exit(1);
   }
  }
}

私は次の結果を得ています。

Node: AdrLine | Val: Corn Exchange 5th Floor
Node: AdrLine | Val: Corn Exchange 5th Floor
Node: AdrLine | Val: Corn Exchange 5th Floor
Node: AdrLine | Val: Corn Exchange 5th Floor

助けてください。タグ値を繰り返す理由がわかりません。期待される出力は

Node: AdrLine | Val: Corn Exchange 5th Floor
Node: AdrLine | Val: Mark Lane 55
Node: AdrLine | Val: EC3R7NE London
Node: AdrLine | Val: GB
4

2 に答える 2

2

ドキュメントの解析中に、 を使用しますDocument.getElementsByTagName(String tagname)。Javadoc によると、ドキュメント内のすべてElementの をドキュメント順で返します。構造には複数のAddrLine要素があり、常にこのリストから 0 番目の要素を選択するため、常に同じ要素が得られます。

代わりに、次のように書きたいと思うかもしれません:

for (int i = 0; i < list.getLength(); i++) {
    Element element = (Element) list.item(i);
    String nodnam = element.getNodeName();

    if (element.getChildNodes().getLength() > 0) // then it has text
    {
    // etc., etc.

要約すると、すでに利用可能な場合は、ドキュメントから要素を取得しようとしないでください。

于 2013-04-04T13:17:02.413 に答える
0

以下は、xml ドキュメント内のすべての要素を出力するために再コンパイルされたプログラムです。

    public static void main(String[] args) {

    try {

        String xmlFile = "staff.xml";
        File file = new File(xmlFile);
        if (file.exists()) {
            // Create a factory
            DocumentBuilderFactory factory = DocumentBuilderFactory
                    .newInstance();
            // Use the factory to create a builder
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(xmlFile);
            doc.getDocumentElement().normalize();
            // Get a list of all elements in the document
            NodeList list = doc.getElementsByTagName("*");

            for (int i = 0; i < list.getLength(); i++) {
                // Get element
                Element element = (Element) list.item(i);
                String nodnam = element.getNodeName();
                if (element.getChildNodes().getLength() > 0) {
                    String val = element.getChildNodes().item(0)
                            .getNodeValue();
                    if (!val.startsWith("\n"))
                        System.out.println(nodnam + "==" + val);
                }
            }
        } else {
            System.out.print("File not found!");
        }
    } catch (Exception e) {
        System.exit(1);
    }
}

ほらね。ファイル内のすべての要素を出力します。

于 2014-10-13T11:25:01.610 に答える