Java可选筛选器xml标记(具有特定条件)
我正在尝试解析xml并筛选不符合特定条件的节点(没有id属性或此属性为空) 我的xml看起来相当简单:Java可选筛选器xml标记(具有特定条件),java,optional,Java,Optional,我正在尝试解析xml并筛选不符合特定条件的节点(没有id属性或此属性为空) 我的xml看起来相当简单: <node/> <!-- not ok node--> <node id = ""/> <!-- not ok node--> <node id=""> <!-- not ok node--> <type>4</type> </node>
<node/> <!-- not ok node-->
<node id = ""/> <!-- not ok node-->
<node id=""> <!-- not ok node-->
<type>4</type>
</node>
<node id = "1"/> <!-- OK node-->
因此,如果节点出错,则不应将其放入节点
集合,而应写入日志消息。如果节点正常,则进入收集,而不显示日志消息。任何关于如何修复它的想法都是受欢迎的。多谢各位
UPD_1
找到了如何收集正确节点(id存在且不为空)的解决方案:
但是如何获取其他节点(错误的节点并编写关于它们的日志)?它表示不可能在ifPresent()之后写入任何内容
多谢各位
UPD_2
最终通过spring数据(thx-to)post解决了这个问题
谢谢大家的帮助。自从JDK 9以来,类可选
有了方法
Runnable notFoundAction=()->Loggers.debug(“id属性为空的节点”);
可选。不可用(解析节点(读取器))
.filter(node->node.getId()!=null&&node.getId()!=“”)
.ifPresentOrElse(节点::add,notFoundAction);
代码不起作用并产生错误为了帮助您修复错误,如果您发布了错误消息并获得了堆栈跟踪,则会有所帮助。如果是IDE错误,则不允许运行代码。顺便说一句,我在代码行旁边添加了错误消息,在注释中,是否必须使用StAX?您可以使用其他解析器,比如Jsoup吗?是的,这是一个遗留代码。实际上问题是可选的,不能让它成为workLegacy代码意味着您必须使用StAX,对吗?您是否也必须使用可选?感谢您发布您的答案。不幸的是,我还没有使用Java 9,是否可以使用Java 8中的Spring Optionals
(Optionals.ifPresentOrElse())执行同样的操作?非常感谢。
try (StaxStreamProcessor processor = new
StaxStreamProcessor(Files.newInputStream(Paths.get(graphConfigPath)))){
Set<Node> nodes = new HashSet<>();
XMLStreamReader reader = processor.getReader();
Loggers.debug("started parsing");
while (reader.hasNext()) {
switch (reader.getLocalName()) {
case NODE_TAG:
Optional.ofNullable(reader.getAttributeValue(null, ID_ATTR))
.filter(nodeId -> nodes.add(parseNode(reader))) // error here: Unhandled exception: javax.xml.stream.XMLStreamException
.orElse(Loggers.debug("Node with empty id attribute")); //error here: orElse (java.lang.String) in Optional cannot be applied to (Void)
}
}
}
Optional.ofNullable(parseNode(reader))
.filter(node -> node.getId() != null && node.getId() != "" )
.ifPresent(nodes::add);
Optional opt = Optional.ofNullable(parseNode(reader))
.filter(node -> node.getId() != null && node.getId() != "" );
//Runnable notFoundAction = () -> Loggers.warning("Node with empty id attribute");
Optionals.ifPresentOrElse(
opt,
nodes::add,
() -> Loggers.warning("Node with empty id attribute")
);