读数据——从xml文件中批量读取数据

假设有一个User.xml文件,其内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <user>
        <id>1</id>
        <name>lzj</name>
        <age>28</age>
    </user>
    <user>
        <id>2</id>
        <name>Tom</name>
        <age>20</age>
    </user>
    <user>
        <id>3</id>
        <name>Jerry</name>
        <age>18</age>
    </user>
    <user>
        <id>4</id>
        <name>Jerry</name>
        <age>18</age>
    </user>
    <user>
        <id>5</id>
        <name>Bob</name>
        <age>25</age>
    </user>
    <user>
        <id>5</id>
        <name>Ferry</name>
        <age>30</age>
    </user>
    <user>
        <id>6</id>
        <name>Marry</name>
        <age>39</age>
    </user>
    <user>
        <id>7</id>
        <name>Linda</name>
        <age>20</age>
    </user>
    <user>
        <id>8</id>
        <name>Linda</name>
        <age>23</age>
    </user>
    <user>
        <id>9</id>
        <name>Jiken</name>
        <age>15</age>
    </user>
    ……
</root>

如果这个文件足够大,现在要在批处理程序中批量读取,首先建立对应的java bean

//@XmlRootElement(name = "user") //指定根元素
public class User implements Serializable{

    private String id;
    private String name;
    private String age;
    //省略set、get、toString方法
}

批处理程序程序如下:

@Configuration
public class BatchConfig {

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Value("${spring.batch.chunk.size:3}")
    private int chunkSize;

    /*1、创建一个Job作业*/
    @Bean
    public Job xmlReaderJob(){
        return jobBuilderFactory.get("xmlReaderJob")
        .start(chunkStep())
        .build();
    }

    //2、创建一个step*/
    @Bean
    public Step chunkStep(){
        return stepBuilderFactory.get("chunkStep")
                .chunk(chunkSize)                                   //每chunkSize次提交一次
                .reader(xmlItemReader())                            //读取xml文件,并把文件中每个标签中数据映射到工程中的User bean中
                .writer(list -> list.forEach(System.out::println))
                .allowStartIfComplete(true)
                .build();
    }

    //3、配置要读取文件的特性*/
    @Bean
    public ItemReader<User> xmlItemReader(){
        StaxEventItemReader<User> reader = new StaxEventItemReader<>(); //StaxEventItemReader用来读取xml文件
        reader.setResource(new ClassPathResource("/data/User.xml"));    //设置xml文件位置
        reader.setFragmentRootElementName("user");  //指定xml文件的根元素,或者在User.java类上用@XmlRootElement(name = "user")
        reader.setUnmarshaller(getMarShaller());    //把xml文件中数据映射到User.java中
//      reader.setUnmarshaller(getJaxbMarShaller()); //未实现
        return reader;
    }

    private Jaxb2Marshaller getJaxbMarShaller(){
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setClassesToBeBound(User.class);
        return marshaller;
    }

    private XStreamMarshaller getMarShaller(){
        XStreamMarshaller marShaller = new XStreamMarshaller();
        Map<String, Class> map = new HashMap<>();
        map.put("user", User.class); //把<user>标签中数据映射到User.class类中
        marShaller.setAliases(map);
        return marShaller;
    }

}

程序中应用到了把xml转化为java bean的技术,需要将spring-oxm包,需导入工程中

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
        </dependency>

运行批处理程序,会打印出如下结果:

……
User [id=1, name=lzj, age=28]
User [id=2, name=Tom, age=20]
User [id=3, name=Jerry, age=18]
User [id=4, name=Jerry, age=18]
User [id=5, name=Bob, age=25]
User [id=5, name=Ferry, age=30]
User [id=6, name=Marry, age=39]
User [id=7, name=Linda, age=20]
User [id=8, name=Linda, age=23]
User [id=9, name=Jiken, age=15]
……
### 批量修改 XML 文件属性的方法与工具 #### 使用专用的 XML 编辑工具 Liquid XML Studio 是一种功能强大的 XML 工具集合,其中包含了专门用于编辑和管理 XML 的组件。通过其内置的 **XML Schema Editor** 和 **XPath 表达式构建器**,可以实现复杂的查询以及批量更新操作[^1]。例如,在 Liquid XML 中可以通过定义 XPath 查询定位目标节点并执行替换或修改。 #### 利用编程语言处理 XML 数据 对于需要高度定制化的场景,采用脚本语言如 Python 或 R 来完成批量修改是一种常见做法: ##### 基于 Python 的解决方案 Python 提供了多种库来简化 XML 文件的操作过程。以下是利用 `lxml` 库的一个简单示例,展示如何批量更改特定标签下的某个属性值: ```python from lxml import etree def modify_xml_attribute(file_path, tag_name, attribute_key, new_value): tree = etree.parse(file_path) root = tree.getroot() # 查找指定标签的所有实例 elements = root.findall(f".//{tag_name}") for element in elements: if attribute_key in element.attrib: element.set(attribute_key, new_value) # 将修改后的树保存回原文件或者新文件 tree.write(file_path, pretty_print=True, xml_declaration=True, encoding='utf-8') # 调用函数进行实际修改 modify_xml_attribute('example.xml', 'node', 'attrName', 'newValue') ``` 上述代码片段展示了如何遍历整个文档结构找到匹配条件的目标节点,并设置新的属性值[^2]。 ##### 基于 R 的解决方案 如果倾向于使用统计分析环境,则可以选择 R 及其配套扩展包来进行类似的自动化任务。下面的例子演示了借助 `xml2` 包读取现有 XML 文档并对某些字段实施调整的过程: ```r library(xml2) doc <- read_xml("input.xml") nodes <- xml_find_all(doc, ".//tagName[@attributeKey]") for (node in nodes){ xml_attr(node, "attributeKey") <<- "newAttributeValue" } write_xml(doc, "output.xml") ``` 此段程序同样实现了查找符合条件的对象列表并将它们逐一修正的目的[^3]。 #### 修改 Maven 项目的 pom.xml 配置项 当涉及到 Java 开发领域内的依赖管理和版本控制时,经常需要用到 Apache Maven 构建系统及其核心描述符——pom.xml 文件。假设要克隆一份现有的工程作为独立分支继续开发工作的话,那么除了基本元数据之外还需要同步调整其他关联参数以避免冲突发生。比如上面提到过的 artifactId 字段就是其中之一[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值