首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java 8搜索XML

用Java 8搜索XML
EN

Stack Overflow用户
提问于 2018-01-15 12:39:19
回答 1查看 77关注 0票数 1

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

代码语言:javascript
复制
<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> 

所需的是一个工具,它可以从单个或多个搜索/查询中提取事实代码及其值,方法如下:

代码语言:javascript
复制
id           type                   value
----------   --------------------   -------
135719887    TOTAL_DUE_AMOUNT       832.15
135719887    AUTO_PAY               false
135719887    CREDIT_CARD_EXPIRED    false
135719887    HAS_SEDONA_CHARGES     true

例如,查询如下:

哪些Id具有CREDIT_CARD_EXPIRED = false,以及AUTO_PAY = true哪个Id具有CREDIT_CARD_EXPIRED = true,OR,AUTO_PAY = false Id xxxxxxxxx的TOTAL_DUE_AMOUNT事实值是多少?

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

性能不像灵活性那么重要。

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-15 14:10:15

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

代码语言:javascript
复制
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的所有ids。

  1. 使用DTO,它可以使用IDE插件或其他工具从XML生成。
  2. 在循环中读取文件并创建DTO集合,然后应用过滤器。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48263225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档