Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从XML中提取一个布尔字段?_Java_Xml_Parsing - Fatal编程技术网

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

Java 如何从XML中提取一个布尔字段?,java,xml,parsing,Java,Xml,Parsing,我有一个XML格式的模型,如下所示,我需要解析XML并检查我的XML是否将内部标志设置为true。在我的其他模型中,可能会将内部标志设置为false。有时,这个字段也可能不在那里,所以在我的代码中,默认情况下它是false <?xml version="1.0"?> <ClientMetadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.goo

我有一个XML格式的模型,如下所示,我需要解析XML并检查我的XML是否将内部标志设置为true。在我的其他模型中,可能会将内部标志设置为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>
现在,确定我的模型是否将内部标志设置为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的小案例,并且只有一个元素

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

查找字符串文本的索引。如果它不存在,则返回false。 继续,长度为15个字符。读到下一个,它应该是字符串true或false。 获取该字符串,使用Boolean.parseBooleanString获取布尔值。
如果你想让我帮你写代码,请留言

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

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。

如果您愿意考虑将Groovy添加到您的混合中,例如,见书java Jroovy,那么使用Groovy XMLParser和相关类将使这一点变得简单。 若您需要坚持使用Java,让我为我的应用程序添加一个无耻的插件,它模仿了很多Groovy的方式。你的问题的答案是:

Xen doc = new XenParser().parseText(YOUR_XML_STRING);
String internalFlag = doc.getText(".client.internal-flag");
boolean isSet = "true".equals(internalFlag);
如果XML来自文件、流或URI,也可以对其进行处理


注意:emptor,尽管它是免费的,但这是一个相当新的库,仅由随机的人编写,没有对所有疯狂的XML进行彻底测试。如果有人知道一个类似的、更主流的库,我很想听听。

您的bean是如何从XML中填充的?如何获取所有其他字段,例如name?@Thilo,到目前为止,我还没有对XML做任何事情。在我的ModelMetadata类中,有一个名为modelValue的变量—该变量以字符串格式存储XML,这意味着我需要使用字符串modelValue=model.getModelValue;要进行XML解析。有关XML解析选项,请参阅此@Thilo,我开始使用Stax解析XML,但遇到了问题。我已经用我的代码更新了这个问题。我认为这不是一个好主意。即使您可以完全控制XML生成。XPath之类的东西并不难使用,字符串解析xml从来都不是一个好建议。您需要注意编码,并确保搜索字符串没有被注释掉,以及其他内容。最后,您将自己编写一个XML解析器。这不是一个好主意。XMLBeam看起来很适合从XML中快速读取几个字段。谢谢你指出这一点。
Has flag:true
Xen doc = new XenParser().parseText(YOUR_XML_STRING);
String internalFlag = doc.getText(".client.internal-flag");
boolean isSet = "true".equals(internalFlag);