Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

xmlの属性の設定と取得について

やりたいことはxmlを読込み、タグの属性値を単純に出力するだけなのですが、どうしても上手く処理できずに困っています。

読み込み対象のxmlは下記の内容です。
=============================================
<?xml version="1.0" encoding="Shift_JIS" ?>
<element
A="a
"
B="bb
"
C="ccc
"
D="dddd
"
E="eeeee
"
F="ffffff
"
G="ggggggg
"
H="hhhhhhhh
"
/>
=============================================

このxmlを読み込み、各属性値を見ていくと、
Gの値が"ggggggg"になると思っているのですが、
なぜか"hhhhhhhh"になってしまいます。

A〜Fのうちひとつでも欠ければ、問題なく"ggggggg"が出力されるだけに、理解に苦しみます。

お分かりになる方教えて下さい。

実行環境:Windows XP+Java 1.6 Update2

私が試しているPGと出力結果です。
プログラム
=============================================
import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;

public class AttributesTest extends DefaultHandler {

    public static void main(String[] args) {
        //XMLファイルを指定
        String xmlFile = "c:\\AttributesTest.xml";
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            factory.setValidating(false);
            FileInputStream input = new FileInputStream(new File(xmlFile));
            SAXParser saxParser = factory.newSAXParser();
            saxParser.parse(input, new AttributesTest());
        } catch (Exception e) {
            System.err.println(e);
        }
    }

    public void startDocument() {
        System.out.println("startDocument");
    }

    public void startElement(String namespaceURI,
                                String localName,
                                String qName,
                                Attributes atts) {
        for (int i = 0; i < atts.getLength(); i++) {
            System.out.println("SAX Attribut: " 
                                + atts.getQName(i)
                                + " : " + atts.getValue(i));
        }
    }

    public void endDocument() {
        System.out.println("endDocument");
    }
}
=============================================

実行結果
=============================================
startDocument
SAX Attribut: A : a 
SAX Attribut: B : bb 
SAX Attribut: C : ccc 
SAX Attribut: D : dddd 
SAX Attribut: E : eeeee 
SAX Attribut: F : ffffff 
SAX Attribut: G : hhhhhhhh
SAX Attribut: H : hhhhhhhh 
endDocument
=============================================

10

回答

5120

閲覧

10件の回答

評価

0

ハッシュ値が同じだからでは?

評価

0

??さん

ご回答ありがとうございます。

ですが、キーの文字列を変えても値を変えても、
最後の2つの値は一緒になってしまいますし、
試しに先頭の属性を消せば解消するので
ご指摘とは異なる現象なのかと…

評価

0

どう見ても原因不明です。
もう一度うまく動かないc:\AttributesTest.xmlを
貼って貰っていいですか?

評価

0

ゆきおさん

ご回答ありがとうございます。

下記にc:\AttributesTest.xmlの内容を貼り付けます。
================================================
<?xml version="1.0" encoding="Shift_JIS" ?>
<element
A="a
"
B="bb
"
C="ccc
"
D="dddd
"
E="eeeee
"
F="ffffff
"
G="ggggggg
"
H="hhhhhhhh
"
/>
================================================

まだ、いろいろ試している最中なのですが、

javaのバージョンを1.6 Update3にあげても、
DOMで読み込むようにして、同様の処理をしても結果は変わらないです。

一応DOMで読み込むようにしたプログラムも貼り付けます。

================================================
import java.io.File;
import java.io.FileInputStream;

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;

public class AttributesTest extends DefaultHandler {

    public static void main(String[] args) {
        //XMLファイルを指定
        String xmlFile = "c:\\AttributesTest.xml";
        
        //SAXで読み込み
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            factory.setValidating(false);
            FileInputStream input = new FileInputStream(new File(xmlFile));
            SAXParser saxParser = factory.newSAXParser();
            saxParser.parse(input, new AttributesTest());
        } catch (Exception e) {
            System.err.println(e);
        }
        
        //DOMで読み込み
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(new File(xmlFile));
            Element element = doc.getDocumentElement();

            for (int j = 0; j < element.getAttributes().getLength(); j++) {
                Node attr = element.getAttributes().item(j);
                System.out.println("DOM Attribut: "
                                    + attr.getNodeName()
                                    + " : " + attr.getNodeValue());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void startDocument() {
        System.out.println("startDocument");
    }

    public void startElement(String namespaceURI,
                                String localName,
                                String qName,
                                Attributes atts) {
        for (int i = 0; i < atts.getLength(); i++) {
            System.out.println("SAX Attribut: " 
                                + atts.getQName(i)
                                + " : " + atts.getValue(i));
        }
    }

    public void endDocument() {
        System.out.println("endDocument");
    }
}

================================================

上記プログラムの実行結果です。
================================================
startDocument
SAX Attribut: A : a 
SAX Attribut: B : bb 
SAX Attribut: C : ccc 
SAX Attribut: D : dddd 
SAX Attribut: E : eeeee 
SAX Attribut: F : ffffff 
SAX Attribut: G : hhhhhhhh
SAX Attribut: H : hhhhhhhh 
endDocument
DOM Attribut: A : a 
DOM Attribut: B : bb 
DOM Attribut: C : ccc 
DOM Attribut: D : dddd 
DOM Attribut: E : eeeee 
DOM Attribut: F : ffffff 
DOM Attribut: G : hhhhhhhh
DOM Attribut: H : hhhhhhhh 
================================================

よろしくお願いします。

評価

0

コピペしてみましたが、問題なく表示できました。
実はファイルうまく保存されておらず、古いファイルを読み込んでいたりしませんか。

評価

0

mioさん

テストしていただきありがとうございます。

古いファイルではやっていないです。

なにか、環境に依存するのかと思って
複数のPCでテストしても同じ結果になってます。

参考までにmioさんの環境を教えていただくことはできないでしょうか?

よろしくお願いします。

評価

0

同じく問題ないですね・・・
DOMでも駄目となるとxmlファイルに問題があるのかなー

とりあえず↓こう
<?xml version="1.0" encoding="Shift_JIS" ?>
<element
A="a" B="bb" C="ccc" D="dddd" E="eeeee" F="ffffff" G="ggggggg" H="hhhhhhhh"
/>

とか、↓こう
<?xml version="1.0" encoding="Shift_JIS" ?>
<element
A="a" B="bb" C="ccc" D="dddd" E="eeeee" F="ffffff" G="1111" H="22222"
/>
に書き換えて試してみるとどうでしょう?
あんまり役に立てなくてすみませんね。

評価

0

環境の問題でしょうかね…。
WinXP Pro sp2 + JDK6 update 3ですが。

1.4の頃のSAXにはけっこう不具合があったように思うのですが、実はjdk6を使おうとして古いものを使っていませんか。

評価

0

ゆきおさん

ご提示いただいたように1行にまとめて書くと
何の問題もなく処理されますし、
下記のように1つでも1行に納めても正常な結果を返します。
===============================================
<?xml version="1.0" encoding="Shift_JIS" ?>
<element
A="a"
B="bb
"
C="ccc
"
D="dddd
"
E="eeeee
"
F="ffffff
"
G="ggggggg
"
H="hhhhhhhh
"
/>
===============================================


>あんまり役に立てなくてすみませんね。
いえいえ、テストして頂いただけでも十分うれしいです。

ありがとうございます。

評価

0

mioさん

環境はまったく一緒です。

jdkも間違いなく1.6 Update 3 です…

試しに1.4.2_08でコンパイル・実行してみたのですが、
そちらでは正常な結果が返ってきているので、余計に困り果てていました。

でも、正常に動作する方がいらっしゃる事が分かっただけでも収穫です。

ありがとうございます。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。