0

0

XML数据映射中的数据聚合与分组

煙雲

煙雲

发布时间:2026-02-16 09:05:02

|

715人浏览过

|

来源于php中文网

原创

xpath 1.0不支持分组聚合,需宿主语言配合实现;如python用lxml提取后字典分组,java jaxb需避免同名list丢失结构,xslt 2.0+可用for-each-group但依赖处理器。

xml数据映射中的数据聚合与分组

XML解析时如何用XPath做分组聚合

原生XPath 1.0不支持group-bysum()跨节点聚合,强行写//item[price > 50]/sum(price)会报错——XPath 1.0里sum()只能作用于节点集,不能嵌套在谓词中。真要分组统计,得靠宿主语言配合。

实操建议:

  • lxml(Python)或Document.evaluate()(JS)先提取所有目标节点,再用宿主语言分组:比如按@category属性值分组,再对每组price子元素求和
  • 若用XSLT,XPath 2.0+可用for-each-group,但需确认处理器支持(如Saxon),xsltproc默认只支持XPath 1.0
  • 避免在XPath里写复杂逻辑,例如//order[count(item) > 3]看似能筛选“含超3项的订单”,但实际执行效率低,应先取//order,再在代码里判断len(order.findall('item'))

Java JAXB中List字段反序列化后为何丢失分组结构

JAXB默认把同名子元素全映射到一个List,不管它们在XML里是否属于不同父节点。比如<root><a><item>x</item></a><b><item>y</item></b></root>会被映射成单个List<string> items</string>,丢掉a/b的归属关系。

解决路径:

  • 不用@XmlElement直接标在List上,改用@XmlAnyElement + 自定义DomHandler,保留原始节点层级
  • 为每个分组定义独立字段:private List<item> aItems;</item>private List<item> bItems;</item>,并分别用@XmlElement(name = "a")@XmlElement(name = "b")标注
  • 若XML结构固定但分组名动态(如<group id="sales">...</group>),放弃JAXB,改用StAX边读边分组,更可控

Python lxml.etree中用dict模拟分组聚合的典型写法

别依赖XPath一步到位,用Python字典按属性或文本值做键,累积数据最稳。

云点滴客户关系管理CRM OA系统
云点滴客户关系管理CRM OA系统

云点滴客户解决方案是针对中小企业量身制定的具有简单易用、功能强大、永久免费使用、终身升级维护的智能化客户解决方案。依托功能强大、安全稳定的阿里云平 台,性价比高、扩展性好、安全性高、稳定性好。高内聚低耦合的模块化设计,使得每个模块最大限度的满足需求,相关模块的组合能满足用户的一系列要求。简单 易用的云备份使得用户随时随地简单、安全、可靠的备份客户信息。功能强大的报表统计使得用户大数据分析变的简单,

下载
from lxml import etree
<p>xml = """<data>
<record category="A" value="10"/>
<record category="B" value="20"/>
<record category="A" value="15"/>
</data>"""</p><p>root = etree.fromstring(xml)
groups = {}
for elem in root.xpath('//record'):
cat = elem.get('category')
val = float(elem.get('value'))
if cat not in groups:
groups[cat] = {'count': 0, 'total': 0.0}
groups[cat]['count'] += 1
groups[cat]['total'] += val</p><h1>结果:{'A': {'count': 2, 'total': 25.0}, 'B': {'count': 1, 'total': 20.0}}</h1>

注意点:

  • elem.get('attr')elem.attrib['attr']安全,前者返回None,后者键不存在时报KeyError
  • 数值计算前务必类型转换,XML属性值全是字符串,sum()直接加会拼接成"1015"
  • 若分组键是嵌套路径(如./parent/name/text()),先用xpath取一次,别反复调用,影响性能

JSON-like扁平化输出时如何避免重复分组键污染

把XML分组结果转成JSON数组时,常见错误是把每组生成一个对象,却忘了各组间字段名冲突。例如两组都含nameitems,直接json.dump(groups.values())会导致顶层键丢失。

正确做法:

  • 每组封装为带标识的对象:{'group_id': 'A', 'items': [...], 'summary': {...}},而不是裸字典
  • 若需兼容已有JSON Schema,用@XmlAttribute@XmlElementWrapper在JAXB里控制字段名,而非硬编码
  • 警惕XML中空元素:<price></price>text取值为None,参与聚合前必须or 0或跳过,否则float(None)抛异常

分组逻辑越靠近业务语义,越不该压给XPath或注解框架;XML本身没“表”概念,所谓聚合全是应用层视角——这点容易被忽略。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

441

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

321

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

750

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

590

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

199

2023.11.20

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

145

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号