使用Java 8搜索XML

时间:2018-01-15 12:39:20

标签: search java-8

我需要在java 8中创建一个工具来搜索全部位于同一文件夹中的.xml文件列表。每个文件都包含此类型的信息:

library(visNetwork)

nodes <- data.frame(id = 1:10,color = c(rep("blue",6), 
                                        rep("red",3), 
                                        rep("green",1)))
edges <- data.frame(from = c(1,2,3,3,4,5,6,7,8,9),
                    to = c(2,3,4,8,5,6,7,8,9,10),
                    length = c(2,1,1,1,1,1,1,1,1,1))
nodes <- data.frame(nodes, level = edges$from)

visNetwork(nodes, edges, 
           height = "500px", width = "100%",
           main = "Straight Edges") %>% 
  visHierarchicalLayout(edgeMinimization = T,
                        blockShifting = T , 
                        levelSeparation = 89 ) %>%
  visEdges(
    # =========================
           smooth = FALSE, # ========================= straight edges
    # =========================
           shadow = TRUE,
           arrows =list(to = list(enabled = TRUE, scaleFactor = 2)),
           color = list(color = "black", highlight = "red")
    )

需要的是一个可以通过以下方式从单个或多个搜索/查询,FACT代码及其值中提取的工具:

<id>135719887</id>
<FactValue>
    <name>FACT.DOCUMENT.TOTAL_DUE_AMOUNT</name>
    <valueString>832.15</valueString>
</FactValue>
<FactValue>
    <name>FACT.DOCUMENT.AUTO_PAY</name>
    <valueString>false</valueString>
</FactValue>
<FactValue>
     <name>FACT.DOCUMENT.CREDIT_CARD_EXPIRED</name>
    <valueString>false</valueString>
</FactValue>
<FactValue>
    <name>FACT.DOCUMENT.HAS_SEDONA_CHARGES</name>
    <valueString>true</valueString>
</FactValue> 

查询将是,例如:

哪个ID有CREDIT_CARD_EXPIRED = false,AND,AUTO_PAY = true 哪个ID有CREDIT_CARD_EXPIRED = true,OR,AUTO_PAY = false Id xxxxxxxxx

的TOTAL_DUE_AMOUNT个事实的值是多少?

我对以下几件事感兴趣: 1-使用什么数据结构 2-如何迭代所有文件

绩效并不像灵活性那样重要。

提前致谢

1 个答案:

答案 0 :(得分:2)

假设FooDto是您的XML内容的POJO类,那么您可以执行以下操作:

public static void main(String[] args) throws Exception {
    JAXBContext jaxbContext = JAXBContext.newInstance(FooDto.class);

    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    FooDto fooDto1 = (FooDto) jaxbUnmarshaller.unmarshal(getInput("/Foo1.xml"));
    FooDto fooDto2 = (FooDto) jaxbUnmarshaller.unmarshal(getInput("/Foo2.xml"));

    List<String> ids = Stream.of(fooDto1, fooDto2)
            .filter(Main::creditCardIsNotExpired)
            .map(FooDto::getId)
            .collect(Collectors.toList());
}

private static boolean creditCardIsNotExpired(FooDto foo) {
    return Arrays.stream(foo.getFactValue())
            .anyMatch(fact -> fact.getName().equals("FACT.DOCUMENT.CREDIT_CARD_EXPIRED") 
                    && fact.getValueString().equals("false"));
}

此示例为您提供CREDIT_CARD_EXPIRED == false的所有ID。

  1. 使用DTO,可以使用IDE插件或其他工具从XML生成。
  2. 循环读取文件并创建DTO集合,然后应用过滤器。