1

クラスの多くのオブジェクトの属性を含む xml ファイルを読んでいます。DOM xml パーサーを使用しています。このクラスには配列フィールド (NEARBOXID) もあるため、単一の文字列のように xml ファイルから読み取り、その内容を分割する良い方法があるかどうか、またはこれを行うためのより良い方法はありますか?

ファイルは次のようになります。

<CONFIGURATION>
<CONFIG> 
    <BOXID>1</BOXID> 
    <LENGTH>100</LENGTH>
    <NEARBOXID>2,3,4,5</NEARBOXID>
</CONFIG>
    <CONFIG> 
    <BOXID>2</BOXID> 
    <LENGTH>200</LENGTH>
    <NEARBOXID>1,8</NEARBOXID>
</CONFIG>
4

6 に答える 6

1

文字列として読み取り、分割する必要があります。ループを使用して数値を整数に変換しますParseInt

于 2013-01-13T16:13:27.333 に答える
1

いいえ、そのフィールドを分割するのはあなた次第です。メソッドはそれString.splitをうまく行います。

于 2013-01-13T16:13:59.653 に答える
1

完全な文字列から目的の値を取得するには、XPathを使用して必要なタグ内の完全なデータを抽出し、後で を使用する必要があります。String.split()

于 2013-01-13T16:17:31.650 に答える
1

XML を Java オブジェクトに変換しているので、 JAXB (JSR-222)実装を使用してこれを行う方法を示します。JAXB 実装は、Java SE 6 以降の JDK/JRE に含まれています。

NEARBOXID要素の内容をスペースで区切るように変更することをお勧めします。

<NEARBOXID>2 3 4 5</NEARBOXID>

は、XML スキーマの次のエントリに対応します。これは、スペースで区切られた文字列ではなく、スペースで区切られた int 値が要素に含まれていることを検証できることを意味します。

  <xs:element name="NEARBOXID" minOccurs="0">
    <xs:simpleType>
      <xs:list itemType="xs:int"/>
    </xs:simpleType>
  </xs:element>

設定

@XmlList次に、JAXB の注釈を使用して要素をマップできます(参照: http://blog.bdoughan.com/2010/09/jaxb-collection-properties.html )。

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Config {

    @XmlElement(name="BOXID")
    private int boxId;

    @XmlElement(name="LENGTH")
    private int length;

    @XmlElement(name="NEARBOXID")
    @XmlList
    private int[] nearBoxIds;

}

構成

以下のオブジェクトは、XML ドキュメントのルートにマップされます。

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement(name="CONFIGURATION")
@XmlAccessorType(XmlAccessType.FIELD)
public class Configuration {

    @XmlElement(name="CONFIG")
    private List<Config> configs;

}

デモ

以下は、すべてが機能することを証明するデモ コードです。

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Configuration.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum14305301/input.xml");
        Configuration configuration = (Configuration) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(configuration, System.out);
    }

}

input.xml/出力

以下は、デモ コードの実行に対する入力と出力です。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CONFIGURATION>
    <CONFIG>
        <BOXID>1</BOXID>
        <LENGTH>100</LENGTH>
        <NEARBOXID>2 3 4 5</NEARBOXID>
    </CONFIG>
    <CONFIG>
        <BOXID>2</BOXID>
        <LENGTH>200</LENGTH>
        <NEARBOXID>1 8</NEARBOXID>
    </CONFIG>
</CONFIGURATION>
于 2013-01-13T18:26:50.580 に答える
0

データを文字列として抽出し、それに対して split() を実行します。

より良いアプローチは、次のような個々のタグで維持することです

<NEARBOXID>2</NEARBOXID>
<NEARBOXID>3</NEARBOXID>
<NEARBOXID>4</NEARBOXID>
<NEARBOXID>5</NEARBOXID>

xml クエリを解析するには、要件に応じて XPath、XQuery、または JAXB を使用できます。

于 2013-01-13T16:30:19.893 に答える
0

それは選択の問題だと思います。次のように使用できます。

<NEARBOXID>2,3,4,5</NEARBOXID>

または、次のように使用します。

<NEARBOXID>2</NEARBOXID>
<NEARBOXID>3</NEARBOXID>
<NEARBOXID>4</NEARBOXID>
<NEARBOXID>5</NEARBOXID>

2 番目の方法では、最初の方法とは異なる解析コードが必要ですが、文字列の分割と処理に関するコードを節約できます。

于 2013-01-13T16:25:21.977 に答える