如何从XML中提取一个布尔字段?

时间:2015-01-06 04:01:47

标签: java xml parsing

我有一个XML格式的模型,如下所示,我需要解析XML并检查我的XML是否将internal-flag标志设置为true。在我的其他模型中,internal-flag标志可能设置为false。有时候,这个字段也可能不存在,所以默认情况下我的代码会出错。

<?xml version="1.0"?>
<ClientMetadata
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.google.com client.xsd" 
 xmlns="http://www.google.com"> 
    <client id="200" version="13">
        <name>hello world</name>
        <description>hello hello</description>
        <organization>TESTER</organization>
        <author>david</author>
        <internal-flag>true</internal-flag>
        <clock>
            <clock>
                <for>
                    <init>val(tmp1) = 1</init>
                    <clock>
                        <eval><![CDATA[result("," + $convert(val(tmp1)))]]></eval>
                    </clock>
                </for>
                <for>
                    <incr>val(tmp1) -= 1</incr>
                    <clock>
                        <eval><![CDATA[result("," + $convert(val(tmp1)))]]></eval>
                    </clock>
                </for>
            </clock>
        </clock>
    </client>
</ClientMetadata>

我有一个POJO,我在其中存储我的上述模型 -

public class ModelMetadata {

    private int modelId;
    private String modelValue; // this string will have my above XML data as string

    // setters and getters here

}

现在判断我的模型是否设为internal-flag的最佳方式是什么?

// this list will have all my Models stored
List<ModelMetadata> metadata = getModelMetadata();

for (ModelMetadata model : metadata) {
    // my model will be stored in below variable in XML format
    String modelValue = model.getModelValue();

    // now parse modelValue variable and extract `internal-flag` field property
}

我是否需要为此使用XML解析,或者有更好的方法吗?

更新: -

我已经开始使用Stax了,这是我到目前为止所尝试的但不确定如何提取该字段 -

InputStream is = new ByteArrayInputStream(modelValue.getBytes());

XMLStreamReader r = XMLInputFactory.newInstance().createXMLStreamReader(is);
while(r.hasNext()) {
    // now what should I do here?
}

3 个答案:

答案 0 :(得分:4)

使用XMLBeam披露:我与该项目有关联)有一个简单的解决方案,只需几行:

public class ReadBoolean {
    public interface ClientMetaData {
        @XBRead("//xbdefaultns:internal-flag")
        boolean hasFlag();
    }
    public static void main(String[] args) throws IOException {
      ClientMetaData clientMetaData = new XBProjector().io().url("res://xmlWithBoolean.xml").read(ClientMetaData.class);      
      System.out.println("Has flag:"+clientMetaData.hasFlag());
    }
}

此程序打印出来

Has flag:true

表示您的XML。

答案 1 :(得分:0)

您也可以进行一些简单的字符串解析,但这仅适用于具有适当XML的小案例,并且只有一个<internal-flag>元素。

这是一个简单的解决方案,无需使用任何XML解析实用程序。其他解决方案可能更强大或更强大。

  1. 查找字符串文字<internal-flag>的索引。如果它不存在,则返回false。
  2. 前进"<internal-flag>".length(15)个字符。请阅读下一个</internal-flag>,其中应为字符串truefalse
  3. 取该字符串,使用Boolean.parseBoolean(String)获取布尔值。
  4. 如果您希望我帮您解决问题,请发表评论!

答案 2 :(得分:0)

如果您愿意考虑将Groovy添加到您的混合中(例如,请参阅本书 Making Java Groovy ),那么使用Groovy XMLParser和相关的类将使这变得简单。

如果你需要坚持Java,那么让我为我的Xen library添加一个无耻的插件,它模仿了很多“Groovy方式”。你的问题的答案是:

Xen doc = new XenParser().parseText(YOUR_XML_STRING);
String internalFlag = doc.getText(".client.internal-flag");
boolean isSet = "true".equals(internalFlag);

如果XML来自文件,流或URI,也可以处理。

Caveat emptor ,(即使它是免费的)这是一个相当新的库,仅由一个随机的人(我)编写,并没有在所有疯狂的XML上进行彻底的测试。如果有人知道一个类似的,更“主流”的图书馆,我会非常有兴趣听到它。