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

mongodb 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

mongodb json

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

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

相关文章

java串口发送16进制数据_MFC串口通信发送16进制数据的方法

本文实例为大家分享了MFC串口通信发送16进制数据的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下MFC串口通信会使用m_mscomm控件。发送数据一般是在edit control 里输入自己想发送的内容&#xff0c;然后点击send button。如果直接发送字符串内容&#xff0c;通过下…

python集合和字典的区别_Python中的字典和集合

导语&#xff1a;本文章记录了本人在学习Python基础之数据结构篇的重点知识及个人心得&#xff0c;打算入门Python的朋友们可以来一起学习并交流。 本文重点&#xff1a; 1、掌握常见的字典创建&#xff0c;查询&#xff0c;判别方法&#xff1b; 2、了解字典中的defaultdict、…

apache ignite_Apache Ignite本机持久性,简要概述

apache ignite通过将数据的工作集放入系统内存中&#xff0c;内存中方法可以达到极高的速度。 当所有数据都保存在内存中后&#xff0c;就不再需要处理使用传统旋转磁盘引起的问题。 例如&#xff0c;这意味着无需维护数据的其他缓存副本并管理它们之间的同步。 但是这种方法还…

java jigsaw_Java 9,Jigsaw,JPMS和模块:个人探索

java jigsawJava 9由于Jigsaw项目而延迟了很多次&#xff0c;您可能会听到很多关于模块&#xff0c;模块化和其他内容的信息&#xff0c;那么&#xff0c;这到底是什么呢&#xff1f; 什么是模块化&#xff0c;模块化平台是什么意思&#xff1f; Java平台模块系统&#xff08;J…

mysql explain 为空_车祸现场!我的MySQL千万级数据表选错索引了!

最近在线上环境遇到了一次SQL慢查询引发的数据库故障&#xff0c;影响线上业务。经过排查后&#xff0c;确定原因是&#xff1a;SQL在执行时&#xff0c;MySQL优化器选择了错误的索引(不应该说是“错误”&#xff0c;而是选择了实际执行耗时更长的索引)。排查过程中&#xff0c…

java登录界面命令_Java命令行界面(第25部分):JCommando

java登录界面命令JCommando 网站 上将JCommando描述为“命令行参数的Java参数解析器”。 JCommando读取XML配置以生成一个Java类&#xff0c;该类处理Java应用程序中的解析。 在提供XML配置的 Java命令行解析库的本系列文章中&#xff0c;以前涵盖的唯一基于Java的库是JSAP &am…

数据追加用什么函数_RL用算法发现算法:DeepMind 数据驱动「价值函数」自我更新,14款Atari游戏完虐人类!...

【新智元导读】击败卡斯帕罗夫的「深蓝」并不是真正的人工智能&#xff0c;它过度依赖了人类设计的规则&#xff0c;而最近DeepMind的一项深度强化学习新研究表明&#xff0c;不用人工介入&#xff0c;完全数据驱动&#xff0c;算法自己就能发现算法。「深蓝」并非以智取胜&…

@cacheable 是否缓存成功_缓存策略:如何使用缓存来减少磁盘IO?

现代的消息队列&#xff0c;都使用磁盘文件来存储消息。因为磁盘是一个持久化的存储&#xff0c;即使服务器掉电也不会丢失数据。绝大多数用于生产系统的服务器&#xff0c;都会使用多块儿磁盘组成磁盘阵列&#xff0c;这样不仅服务器掉电不会丢失数据&#xff0c;即使其中的一…

g++ 安装python_以后再也不用“教程”:让人举一反三的python配置环境过程 + 超简单原理概括!...

前言&#xff1a; 前一阵子至少指导了5位学弟学妹小伙伴配置 python 环境。两年前我入门 python 时&#xff0c;也得照着互联网上的资料&#xff0c;一步一步“照猫画虎”&#xff1b;为什么现在自己可以“凭感觉”一气呵成了呢&#xff1f;我想&#xff0c;原因必然是自己对于…

通过Java和Spring Boot应用程序将Gmail用作SMTP服务器

Gmail用户可以使用Gmail的SMTP服务器smtp.gmail.com从其Spring Boot应用程序发送电子邮件。 为此&#xff0c;让我们在应用程序中进行一些设置&#xff1a; 在application.properties文件中提供SMTP连接属性&#xff1a; spring.mail.hostsmtp.gmail.com spring.mail.username…

java面向对象类似atm的题_Java面向对象练习题之银行存取款

编写Java应用程序。首先定义一个描述银行账户的Blank类&#xff0c;包括成员变量“账号”和“存款余额”&#xff0c;成员方法有“存款”、“取款”和“余额查询”。其次&#xff0c;编写一个主类&#xff0c;在主类中测试Blank类的功能。String ZhangHao;double YuE;Blank(Str…

mongodb如何写入图片_CTO之瞳-数据库-MongoDB

MongoDB&#xff0c;常用的NoSql数据库&#xff0c;在https://db-engines.com/en/ranking 里被分类为文档型数据库。​本文从以下五个方面来了解MongoDB (和上一篇一样&#xff0c;基础操作请查询官方文档或者菜鸟教程&#xff09;使用场景存储引擎性能测试索引-B树分片与复制1…

小波滤波器与其他滤波器的区别_滤波器国产 VS 国外

一、滤波器技术及产品类型详细分析几次技术应用的潮流引领了声波射频滤波器技术的发展&#xff0c;而SAW滤波器可以说是军用转民用的技术典范。早期国内的SAW滤波器仅用于国防如雷达、通信等方面需求&#xff1b;而该技术的第一次民用&#xff0c;即用于彩电产业&#xff0c;带…

Unix/Linux/BSD 它们之间的关系以及各自派系的介绍

文章目录一、Unix 是什么二、Unix 派系&#xff08;一&#xff09;BSD 分支1.BSD 是什么2.由 BSD 衍生的闭源 Unix 版本3.由 BSD 衍生的开源 Unix 版本&#xff08;二&#xff09;System V 分支1.System V 是什么2.System V 与 BSD 的版权纠纷&#xff0c;以及 UnixWare 的由来…

arraylist获取前多少位_Java 面试题 :百度前 200 页都在这里

作者&#xff1a;唐尤华&#xff0c;基本概念操作系统中 heap 和 stack 的区别什么是基于注解的切面实现什么是 对象/关系 映射集成模块什么是 Java 的反射机制什么是 ACIDBS与CS的联系与区别Cookie 和 Session的区别fail-fast 与 fail-safe 机制有什么区别get 和 post请求的区…

航空订票系统界面java_Java命令行界面(第21部分):航空公司2

航空订票系统界面java本系列文章的第21篇关于Java中解析命令行参数的文章的重点是Airline 2库。 Airline 2的GitHub项目页面描述了该库&#xff0c;“ Airline是一个Java库&#xff0c;提供了基于注释的框架来解析命令行界面。” 该页面进入状态&#xff1a;航空公司“同时支持…

python爬虫数据_python爬取数据分析

一.python爬虫使用的模块 1.import requests 2.from bs4 import BeautifulSoup 3.pandas 数据分析高级接口模块 二. 爬取数据在第一个请求中时, 使用BeautifulSoupimport requests # 引用requests库 from bs4 import BeautifulSoup # 引用BeautifulSoup库 res_movies requests…

java 迁移数据_Java 9迁移指南:七个最常见的挑战

java 迁移数据我敢肯定&#xff0c;您已经听说过更新到Java 9并不是一件容易的事&#xff0c;甚至可能是不兼容的更新&#xff0c;而且对于大型代码库而言&#xff0c;迁移毫无意义。 这样做之后&#xff0c;我迁移了一个相当大的旧代码库&#xff0c;我可以告诉你&#xff0c;…

markdown java 代码高亮_MarkdownPad2使用代码高亮插件

MarkdownPad 2有插入代码块的功能&#xff0c;但样式却不尽人意&#xff0c;但又不想换个编辑器&#xff0c;找了挺多相关资料&#xff0c;最后在MarkdownPad 2集成prettify高亮插件。如下相关资料&#xff1a;你可以下载后引用&#xff0c;也可以直接引用bootcdn。具体步骤&am…

需求调研 现有系统梳理_对速度的需求,访问现有数据的速度提高了1000倍

需求调研 现有系统梳理了解如何通过使用标准Java 8流和Speedment的In-JVM-Memory加速器将分析数据库应用程序加速1000倍。 Web和移动应用程序有时会很慢&#xff0c;因为后备数据库很慢和/或与数据库的连接施加了延迟。 现代的UI和交互式应用程序需要快速后端&#xff0c;并且…