如何从 XML 中提取一个布尔字段?
How to extract one boolean field from XML?
我有一个 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 且只有一个 <internal-flag>
元素的小情况。
这是一个简单的解决方案,无需使用任何 XML 解析实用程序。其他解决方案可能更强大或更强大。
- 找到字符串文字的索引
<internal-flag>
。如果不存在,return false.
- 前进
"<internal-flag>".length
(15) 个字符。阅读下一个 </internal-flag>
,它应该是字符串 true
或 false
.
- 取那个字符串,使用
Boolean.parseBoolean(String)
得到一个布尔值。
如果您希望我帮助您完成代码,请发表评论!
有一个使用 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.
如果您愿意考虑将 Groovy 添加到您的混音中(例如,请参阅 Making Java Groovy 一书),然后使用Groovy XML解析器和关联的 类 将使这变得简单。
如果你需要坚持 Java,让我为我的 Xen library 添加一个无耻的插件,它模仿了很多 "Groovy way"。你的问题的答案是:
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 在那里。如果有人知道类似的、更多的 "mainstream" 库,我将非常有兴趣了解它。
我有一个 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 且只有一个 <internal-flag>
元素的小情况。
这是一个简单的解决方案,无需使用任何 XML 解析实用程序。其他解决方案可能更强大或更强大。
- 找到字符串文字的索引
<internal-flag>
。如果不存在,return false. - 前进
"<internal-flag>".length
(15) 个字符。阅读下一个</internal-flag>
,它应该是字符串true
或false
. - 取那个字符串,使用
Boolean.parseBoolean(String)
得到一个布尔值。
如果您希望我帮助您完成代码,请发表评论!
有一个使用 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.
如果您愿意考虑将 Groovy 添加到您的混音中(例如,请参阅 Making Java Groovy 一书),然后使用Groovy XML解析器和关联的 类 将使这变得简单。
如果你需要坚持 Java,让我为我的 Xen library 添加一个无耻的插件,它模仿了很多 "Groovy way"。你的问题的答案是:
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 在那里。如果有人知道类似的、更多的 "mainstream" 库,我将非常有兴趣了解它。