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

You should read as string and split it. Using a loop convert the numbers into integer using ParseInt

于 2013-01-13T16:13:27.333 回答
1

No, it's up to you to split that field. The String.split method will do it just fine.

于 2013-01-13T16:13:59.653 回答
1

您需要使用XPath提取所需标记中的完整数据,然后使用String.split(), 从完整字符串中获取所需的值。

于 2013-01-13T16:17:31.650 回答
1

由于您要将 XML 转换为 Java 对象,因此我将演示如何使用JAXB (JSR-222)实现来完成此操作。从 Java SE 6 开始,JAXB 实现包含在 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>

配置

然后您可以使用 JAXB 的@XmlList注释映射元素(请参阅: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);
    }

}

输入.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

我认为这是一个选择问题。你可以这样使用它:

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

或者你这样使用它:

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

第二种方式需要您使用与第一种不同的解析代码,但您可以节省一些用于拆分和处理字符串的代码。

于 2013-01-13T16:25:21.977 回答
0

将数据提取为字符串并对其执行 split() 。

更好的方法是维护单个标签,例如

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

对于解析 xml 查询,您可以根据需要使用 XPath、XQuery 或 JAXB。

于 2013-01-13T16:30:19.893 回答