Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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_Optional - Fatal编程技术网

Java可选筛选器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>

我正在尝试解析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-->
因此,如果节点出错,则不应将其放入
节点
集合,而应写入日志消息。如果节点正常,则进入收集,而不显示日志消息。任何关于如何修复它的想法都是受欢迎的。多谢各位

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