在MongoDB和Spring Batch中将XML转换为JSON和原始使用

总览

为什么将XML转换为JSON以在MongoDB中原始使用?

由于MongoDB使用JSON文档存储记录,就像表和行将记录存储在关系数据库中一样,我们自然需要将XML转换为JSON。

某些应用程序可能需要存储原始(未修改的)JSON,因为在如何构造数据方面存在不确定性。

有数百种基于XML的标准 。 如果应用程序要处理不遵循相同标准的XML文件,则数据的结构将存在不确定性。

为什么要使用Spring Batch?

Spring Batch提供了可重用的功能,这些功能在处理大量记录时是必不可少的,而其他功能则可以实现高容量和高性能的批处理作业。 Spring网站已很好地记录了Spring Batch 。

有关Spring Batch的另一个教程,请参阅我以前的文章“ 使用Spring Batch处理CSV” 。

0 –将XML转换为JSON以在MongoDB中与Spring Batch示例应用程序一起使用

该示例应用程序转换XML文档,该XML文档是用于配置音乐播放列表的“策略”。 该策略旨在类似于真实的网络安全配置文档。 它是一个简短的文档,但说明了如何搜索复杂的XML文档。

我们将采用本教程的方法是处理各种样式的XML文件。 我们希望能够处理意外情况。 这就是为什么我们保持数据“原始”的原因。

1 –项目结构

它是典型的Maven结构。 我们为该示例应用程序提供了一个软件包。 XML文件位于src / main / resources中

2 –项目依赖性

除了典型的Spring Boot依赖关系之外,我们还包含嵌入式MongoDB数据库和JSON处理的依赖关系。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.michaelcgood</groupId><artifactId>michaelcgood-spring-batch-mongodb</artifactId><version>0.0.1</version><packaging>jar</packaging><name>michaelcgood-spring-batch-mongodb</name><description>Michael C  Good - XML to JSON + MongoDB + Spring Batch Example</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.7.RELEASE</version><relativePath /> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-batch</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>de.flapdoodle.embed</groupId><artifactId>de.flapdoodle.embed.mongo</artifactId><version>1.50.5</version></dependency><dependency><groupId>cz.jirutka.spring</groupId><artifactId>embedmongo-spring</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20170516</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

3 – XML文档

这是为本教程创建的示例策略文档。 它的结构基于真实的网络安全策略文档。

  • 请注意,文档的父项是Policy标记。
  • 重要信息位于“组”标签内。
  • 查看标记内的值,例如Policy中的ID或status中的日期。

在这个小文档中有很多信息需要考虑。 例如,还有XML名称空间(xmlns)。 在本教程的其余部分中,我们不会涉及到这一点,但是根据您的目标,可能需要为其添加逻辑。

<?xml version="1.0"?>
<Policy  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" style="STY_1.1" id="NRD-1"><status date="2017-10-18">draft</status><title xmlns:xhtml="http://www.w3.org/1999/xhtml">Guide to the Configuration of Music Playlist</title><description xmlns:xhtml="http://www.w3.org/1999/xhtml" >This guide presents a catalog of relevantconfiguration settings for a playlist that I listen to while I work on software development.<html:br xmlns:html="http://www.w3.org/1999/xhtml"/><html:br xmlns:html="http://www.w3.org/1999/xhtml"/>Providing myself with such guidance reminds me how to efficientlyconfigure my playlist.  Lorem ipsum <html:i xmlns:html="http://www.w3.org/1999/xhtml">Lorem ipsum,</html:i> and Lorem ipsum.  Some example<html:i xmlns:html="http://www.w3.org/1999/xhtml">Lorem ipsum</html:i>, which are Lorem ipsum.</description><Group id="remediation_functions"><title xmlns:xhtml="http://www.w3.org/1999/xhtml" >Remediation functions used by the SCAP Security Guide Project</title><description xmlns:xhtml="http://www.w3.org/1999/xhtml" >XCCDF form of the various remediation functions as used byremediation scripts from the SCAP Security Guide Project</description><Value id="is_the_music_good" prohibitChanges="true" ><title xmlns:xhtml="http://www.w3.org/1999/xhtml" >Remediation function to fix bad playlist</title><description xmlns:xhtml="http://www.w3.org/1999/xhtml" >Function to fix bad playlist.Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum</description><value>function fix_bad_playlist {# Load function arguments into local variablesLorem ipsumLorem ipsumLorem ipsum# Check sanity of the inputif [ $# Lorem ipsum ]thenecho "Usage: Lorem ipsum"echo "Aborting."exit 1fi}</value></Value></Group></Policy>

4 – MongoDB配置

在下面,我们指定我们使用的是嵌入式MongoDB数据库,使它可被捆绑在便捷注释@SpringBootApplication中的组件扫描发现,并指定mongoTemplate将是bean。

package com.michaelcgood;import java.io.IOException;
import cz.jirutka.spring.embedmongo.EmbeddedMongoFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.*;
import com.mongodb.MongoClient;@Configuration
public class MongoConfig {private static final String MONGO_DB_URL = "localhost";private static final String MONGO_DB_NAME = "embeded_db";@Beanpublic MongoTemplate mongoTemplate() throws IOException {EmbeddedMongoFactoryBean mongo = new EmbeddedMongoFactoryBean();mongo.setBindIp(MONGO_DB_URL);MongoClient mongoClient = mongo.getObject();MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, MONGO_DB_NAME);return mongoTemplate;}
}

5 –处理XML到JSON

我们的Spring Batch Job的step1()包含调用三个方法来帮助将XML转换为JSON。 我们将分别进行审查。

@Beanpublic Step step1() {return stepBuilderFactory.get("step1").tasklet(new Tasklet() {@Overridepublic RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {// get path of file in src/main/resourcesPath xmlDocPath =  Paths.get(getFilePath());// process the file to jsonString json = processXML2JSON(xmlDocPath);// insert json into mongodbinsertToMongo(json);return RepeatStatus.FINISHED;}}).build();}

5.1 – getFilePath()

此方法只是获取作为参数传递给方法processXML2JSON的文件路径。
注意:

  • ClassLoader正在帮助我们在资源文件夹中找到XML文件。
// no parameter method for creating the path to our xml fileprivate String getFilePath(){String fileName = "FakePolicy.xml";ClassLoader classLoader = getClass().getClassLoader();File file = new File(classLoader.getResource(fileName).getFile());String xmlFilePath = file.getAbsolutePath();return xmlFilePath;}

5.2 – processXML2JSON(xmlDocPath)

getFilePath返回的字符串作为参数传递到此方法中。 从XML文件的字符串创建一个JSONOBject。

// takes a parameter of xml path and returns json as a stringprivate String processXML2JSON(Path xmlDocPath) throws JSONException {String XML_STRING = null;try {XML_STRING = Files.lines(xmlDocPath).collect(Collectors.joining("\n"));} catch (IOException e) {e.printStackTrace();}JSONObject xmlJSONObj = XML.toJSONObject(XML_STRING);String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR);System.out.println("PRINTING STRING :::::::::::::::::::::" + jsonPrettyPrintString);return jsonPrettyPrintString;}

5.3 – insertToMongo(json)

我们将已解析的JSON插入MongoDB文档中。 然后,我们在@Autowired mongoTemplate的帮助下将此文档插入名为“ foo”的集合中。

// inserts to our mongodbprivate void insertToMongo(String jsonString){Document doc = Document.parse(jsonString);mongoTemplate.insert(doc, "foo");}

6 –查询MongoDB

我们的Spring Batch Job的step2()包含我们的MongoDB查询。

  • mongoTemplate.collectionExists基于集合的存在返回一个布尔值。
  • mongoTemplate.getCollection(“ foo”)。find()返回集合中的所有文档。
  • alldocs.toArray()返回一个DBObjects数组。
  • 然后,我们将调用以下三种方法,我们将在下面分别进行回顾。
public Step step2(){return stepBuilderFactory.get("step2").tasklet(new Tasklet(){@Overridepublic RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception{// all printing out to console removed for post's brevity// checks if our collection existsBoolean doesexist = mongoTemplate.collectionExists("foo");// show all DBObjects in foo collectionDBCursor alldocs = mongoTemplate.getCollection("foo").find();List<DBObject> dbarray = alldocs.toArray();// execute the three methods we defined for querying the foo collectionString result = doCollect();String resultTwo = doCollectTwo();String resultThree = doCollectThree();return RepeatStatus.FINISHED;}}).build();}

6.1 –第一个查询

该查询的目标是找到一个样式为“ STY_1.1”的文档。 为此,我们需要记住样式在文档中的位置。 它是政策的产物; 因此,我们将其作为Policy.style来处理

该查询的另一个目标是仅返回策略的id字段。 它也是政策的产物。

通过调用以下方法返回结果: mongoTemplate.findOne(query,String.class,“ foo”); 。 输出为String,因此第二个参数为String.class 。 第三个参数是我们的集合名称。

public String doCollect(){Query query = new Query();query.addCriteria(Criteria.where("Policy.style").is("STY_1.1")).fields().include("Policy.id");String result = mongoTemplate.findOne(query, String.class, "foo");return result;}

6.2 –第二个查询

第二个查询和第一个查询之间的区别是返回的字段。 在第二个查询中,我们返回Value,它是Policy和Group的子级。

public String doCollectTwo(){Query query = new Query();query.addCriteria(Criteria.where("Policy.style").is("STY_1.1")).fields().include("Policy.Group.Value");String result = mongoTemplate.findOne(query, String.class, "foo");return result;}

6.3 –第三次查询

第三个查询的条件不同。 我们只想返回ID为“ NRD-1”且状态日期为“ 2017-10-18”的文档 。 我们只想返回两个字段:title和description,它们都是Value的子级。

请参阅下面的演示中的XML文档或打印的JSON,以进一步澄清查询。

public String doCollectThree(){Query query = new Query();query.addCriteria(Criteria.where("Policy.id").is("NRD-1").and("Policy.status.date").is("2017-10-18")).fields().include("Policy.Group.Value.title").include("Policy.Group.Value.description");String result = mongoTemplate.findOne(query, String.class, "foo");return result;}

7 –Spring批处理作业

作业从步骤1开始,然后调用步骤2。

@Beanpublic Job xmlToJsonToMongo() {return jobBuilderFactory.get("XML_Processor").start(step1()).next(step2()).build();}

8 – @SpringBootApplication

这是一个带有静态void main和@SpringBootApplication的标准类。

package com.michaelcgood;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class SpringBatchMongodb {public static void main(String[] args) {SpringApplication.run(SpringBatchMongodb.class, args);}
}

9 –演示

9.1 –步骤1

JSON打印为字符串。 由于输出很长,因此我在下面省略了输出内容。

Executing step: [step1]
PRINTING STRING :::::::::::::::::::::{"Policy": {"Group": {"Value": {"prohibitChanges": true,"description": {

9.2 –步骤2

我剪切了结果以格式化博客文章的输出。

Executing step: [step2]

检查集合是否存在

Status of collection returns :::::::::::::::::::::true

显示所有对象

list of db objects returns:::::::::::::::::::::[{ "_id" : { "$oid" : "59e7c0324ad9510acf5773c0"} , [..]

只需返回Policy的ID

RESULT:::::::::::::::::::::{ "_id" : { "$oid" : "59e7c0324ad9510acf5773c0"} , "Policy" : { "id" : "NRD-1"}}

要查看打印到控制台的其他结果,请从Github分叉/下载代码并运行该应用程序。

10 –结论

我们已经审查了如何将XML转换为JSON,如何将JSON存储到MongoDB,以及如何在数据库中查询特定结果。

进一步阅读:

  • MongoTemplate
  • JSON.org

源代码在 Github上

翻译自: https://www.javacodegeeks.com/2017/10/converting-xml-json-raw-use-mongodb-spring-batch.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 垃圾回收手动回收_Java垃圾回收(1)

java 垃圾回收手动回收这是有关垃圾收集&#xff08;GC&#xff09;的系列文章中的第一篇。 我希望能够涵盖整个系列过程中的理论知识以及热点虚拟机中的所有主要收集器。 这篇文章仅说明什么是垃圾回收以及不同回收器共有的元素。 我为什么要在乎&#xff1f; 您的Java虚拟机…

使用Apache Isis快速进行SEMAT应用程序开发

TL; DR这篇文章谈论我使用Apache Isis创建并部署到此处的OpenShift Online的SEMAT宠物项目&#xff1a; http&#xff1a; //semat.ofbizian.com Apache Isis 作为主要在后端系统上工作的Java开发人员&#xff0c;我讨厌创建用户界面和处理Java脚本。 幸运的是&#xff0c;有J…

java 对象锁定_少锁定Java对象池

java 对象锁定自从我写任何东西以来已经有一段时间了&#xff0c;我一直在忙于我的新工作&#xff0c;其中涉及在性能调优方面做一些有趣的工作。 挑战之一是减少应用程序关键部分的对象创建。 尽管Java随着时间的推移已改进了GC算法&#xff0c;但垃圾回收打ic一直是Java的主…

Oracle JDBC中的PreparedStatement占位符过多

使用Oracle数据库时&#xff0c;导致ORA-01745&#xff08;“无效的主机/绑定变量名称错误”&#xff09;错误的原因有多种。 关于错误ORA-01500到ORA-02098的Oracle 9i文档提供了有关ORA-01745的更多详细信息。 它指出&#xff0c;“原因”是“绑定变量或INTO规范中的冒号后跟…

webview加载php文件,HYWebview下载自定义文件教程

车机版 HYWebview升级到1.3了多增加了一个进度条多增加了自定义下载URL功能使用教程。浏览器打开DNS地址&#xff1a;103.44.248.95可见 底部有一个 下载链接 和 提货密码 可以输入&#xff01;比如 我们去应用宝官网复制下载链接出来&#xff1a;https://download.sj.qq.com/u…

设计模式 原型模式_设计模式:原型

设计模式 原型模式创新设计模式之一是原型设计模式 。 尽管原型是创造模式&#xff0c;但它在概念上与其他模式有所区别。 我的意思是原型在某种意义上创造了自己。 我将在下面解释。 原型模式的所有魔力都基于Java Object的clone&#xff08;&#xff09;方法。 因此&#x…

Packt和Java Code Geeks提供的$ 5 Java编程书籍!

您好极客&#xff01; 今天&#xff0c;我们为您带来一些激动人心的消息&#xff01; Java Code Geeks和Packt联手为您提供广泛的书籍库每周折扣。 对于开发人员来说&#xff0c;Java仍然是最强大的选择之一&#xff0c;它是定义企业和移动设备的语言。 本周&#xff0c;我们…

源码时代php中级项目,0526PHP班中级项目评比圆满落幕

为了充分发掘同学们开发项目的成功经验&#xff0c;全面提升学员的综合素质&#xff0c;锻炼学员的解说与问题处理能力&#xff0c;源代码教育(源码时代)重庆校区进行了PHP就业班的中级项目评比。项目评比分为演讲、质询、点评及投票评分几个环节&#xff0c;每个环节都精彩纷呈…

qt linux 添加库文件路径,linux下qt使用第三方库的那些事

开发库查看工具&#xff1a;$sudo apt-get install pkg-config很多时候我们并不知道自己电脑有没有这个库&#xff0c;所以我们可以使用这个工具来查看自己有哪些工具&#xff0c;或者哪些工具没有。同时&#xff0c;qmake是对这个工具配置支持的&#xff0c;所以我们很多时候很…

xp系统上安装linux系统教程,XP系统如何安装fedora linux双系统?WinXP安装fedora linux双系统的方法...

有位朋友因为想在linux中熟悉下hadoop的配置开发环境&#xff0c;所以就开始于WinXP系统中安装fedora linux双系统&#xff0c;可是操作了很久都没成功。这该如何怎么办呢&#xff1f;接下来&#xff0c;小编就给大家介绍WinXP安装fedora linux双系统的具体方法。1.下载Fedora-…

pae扩展内存 linux,Linux内核-内存管理-PAE(物理地址扩展)

Intel 通过在处理器上把管脚数从 32 增加到 36&#xff0c;以提高处理器的寻址能力&#xff0c;使其达到 2^3664GB&#xff0c;然而线性地址的位数仍然是 32 位&#xff0c;为此&#xff0c;需引入一种新的分页机制。从pentium pro 处理器开始&#xff0c;intel引入一种叫做 PA…

java嵌入式db_Java DB嵌入式模式

java嵌入式dbJava DB是基于Java编程语言和SQL的关系数据库管理系统。 这是Apache软件基金会的开源Derby项目的Oracle版本。 Java SE 7 SDK中包含Java DB。 Java DB有两个部署选项&#xff1a; Embedded和Network Server 。 这篇文章是关于嵌入式部署或模式的。 1.嵌入式 在嵌…

群晖备份linux分区,数据丢失的后悔药,群晖NAS备份方案详解

“秒速开机”——据说90%的人都是因为这句话而知道的SSD固态硬盘。相比于机械硬盘&#xff0c;SSD固态硬盘开机快、关机快、打开软件快、载入数据快、拷贝快、删除也快——既快乐、又爽快&#xff0c;更是大块人心!然而&#xff0c;SSD固态硬盘已经可以完全取代机械硬盘了吗&am…

tg3269c网卡驱动linux,TP-Link3269C网卡驱动官方版

TG-3269C驱动是一款能够安装于由普联发布的无线网卡驱动&#xff0c;通过此安装驱动我们手机和其他无线设备才能连接上无线网卡并进行上网&#xff0c;同时如果你的网卡经常出现断开和重连、网络不稳定等情况可以通过重新安装驱动&#xff0c;查看是否是硬件的问题&#xff0c;…

使用Spring Security,Thymeleaf和Okta保护Java应用程序的安全

永不再构建身份验证 –喜欢构建用户管理&#xff1f; 使用Okta&#xff0c;您可以在几分钟内为您的应用程序添加社交登录&#xff0c;多因素身份验证和OpenID Connect支持。 立即创建一个免费的开发者帐户。 在构建Java应用程序时&#xff0c;用户管理是至关重要的考虑因素。 …

红旗linux添加usb无线网卡,在Ubuntu 8.10中安装无线网卡RTL8187SE驱动

本人的笔记本是微星的Wind U90&#xff0c;自带的无线网卡是RTL8187SE。这款无线网卡在一般的Linux下是没有驱动的&#xff0c;微星的官方也仅仅提供在OpenSUSE下的驱动。为了在我的Ubuntu下使用这个网卡&#xff0c;只能自己动手了。还好&#xff0c;有了互联网上各位大侠和微…

将Google reCaptcha与Spring Boot应用程序结合使用

介绍 Google的reCaptcha是一个用于防止漫游器向您的公共表单提交数据或访问您的公共数据的库。 在本文中&#xff0c;我们将研究如何将reCaptcha与基于Spring Boot的Web应用程序集成 设置验证码 您应该从管理面板创建API密钥。 您必须创建一个示例应用程序&#xff0c;如下所…

探索 HTTP 请求的世界:get 和 post 的奥秘(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

linux 书签管理工具,在书签管理工具中使用Ubuntu字体

通过便捷书签管理程序(Bookmarklet&#xff0c;一种在浏览器中存放书签URL地址的应用程序)来在大多数的网站上推广使用Ubuntu系统的默认字体。——读者米格尔费尔南迪斯米格尔在他的想法产生之前告诉我们说&#xff1a;“我发现Ubuntu系统的字体在提高可读性上超过了绝大多数的…

linux18.2安装界面,Ubuntu 18.10下安装Grub Customizer 5.1.0配置grub2图形化界面

配置Grub2/burg引导装载程序Grub Customizer 5.1.0新增加对Ubuntu 18.10的支持&#xff0c;我们可以用PPA源来安装&#xff0c;同时还支持Ubuntu 18.04、16.04、14.04。Grub Customizer简介Grub Customizer是用来配置Grub/burg引导装载程序的图形工具&#xff0c;此次发布的5.1…