【问题标题】:How to extract one boolean field from XML?如何从 XML 中提取一个布尔字段?
【发布时间】:2015-03-03 17:18:43
【问题描述】:

我有一个 XML 格式的模型,如下所示,我需要解析 XML 并检查我的 XML 是否将 internal-flag 标志设置为真。在我的其他模型中,internal-flag 标志可能设置为 false。有时,这个字段也可能不存在,所以默认情况下,我的代码中它是 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 设置为 true 的最佳方法是什么?

// 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?
}

【问题讨论】:

  • 如何从 XML 中填充您的 bean?您如何获得所有其他字段(例如“名称”)?
  • @Thilo,到目前为止,我还没有对 XML 做任何事情。在我的ModelMetadata 类中,有一个名为modelValue 的变量——这个变量以字符串格式存储我的XML,这意味着我需要使用String modelValue = model.getModelValue(); 来进行XML 解析。
  • 有关 XML 解析选项,请参阅此stackoverflow.com/questions/23509480/…
  • @Thilo 我开始使用 Stax 解析我的 XML,但卡住了。我已经用我拥有的代码更新了问题。

标签: java xml parsing


【解决方案1】:

使用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。

【讨论】:

  • XMLBeam 看起来很适合从 XML 中快速读取一些字段。感谢您指出。
【解决方案2】:

您也可以进行一些简单的字符串解析,但这仅适用于具有正确 XML 且只有一个 &lt;internal-flag&gt; 元素的小案例。

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

  1. 查找字符串文字&lt;internal-flag&gt; 的索引。如果不存在,则返回 false。
  2. 前进"&lt;internal-flag&gt;".length (15) 个字符。阅读下一个&lt;/internal-flag&gt;,它应该是字符串truefalse
  3. 获取该字符串,使用Boolean.parseBoolean(String) 获取布尔值。

如果您希望我帮助您编写代码,只需发表评论!

【讨论】:

  • 我认为这不是一个好主意。即使您完全控制了 XML 的生成。 XPath 之类的东西并不难使用。
  • 字符串解析 xml 从来都不是一个好建议。您需要注意编码并确保搜索字符串没有被注释掉等等。最后,您最终自己编写了一个 XML 解析器。这是个坏主意。
【解决方案3】:

如果您愿意考虑将 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 上进行全面测试。如果有人知道类似的、更“主流”的库,我会非常有兴趣了解它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-22
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多