gpt4 book ai didi

Java 具有一定条件的可选过滤器 xml 标签

转载 作者:行者123 更新时间:2023-12-01 23:12:32 25 4
gpt4 key购买 nike

我正在尝试解析xml并过滤不符合特定条件的节点(没有id属性或该属性为空)

我的 xml 看起来相当简单:

<node/>            <!-- not ok node-->
<node id = ""/> <!-- not ok node-->
<node id=""> <!-- not ok node-->
<type>4</type>
</node>

<node id = "1"/> <!-- OK node-->

因此,有 3 个错误节点具有空 id 标签或根本没有 id 标签,而 1 个正常节点具有正确 id 标签。解析过滤代码如下(使用了Java的Optional,代码不起作用并产生错误):

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)
}
}
}

因此,如果Node错误,则不应将其放入nodes集合中,而应写入日志消息。如果节点正常,它将进入收集状态,且不会显示日志消息。任何如何修复它的想法都将受到欢迎。谢谢。

UPD_1找到了如何收集正确节点(有 id 且不为空)的解决方案:

Optional.ofNullable(parseNode(reader))
.filter(node -> node.getId() != null && node.getId() != "" )
.ifPresent(nodes::add);

但是如何获取其他节点(错误的节点并编写有关它们的日志)?它说在 ifPresent()

之后不可能写任何东西

谢谢。

UPD_2

最终成功通过 spring-data 解决了该问题(感谢 THIS )帖子。

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")
);

感谢大家的帮助。

最佳答案

从 JDK 9 开始,类 Optional 具有方法 ifPresentOrElse

Runnable notFoundAction = () -> Loggers.debug("Node with empty id attribute");
Optional.ofNullable(parseNode(reader))
.filter(node -> node.getId() != null && node.getId() != "" )
.ifPresentOrElse(nodes::add, notFoundAction);

关于Java 具有一定条件的可选过滤器 xml 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58367089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com