免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4971 | 回复: 9
打印 上一主题 下一主题

解析xml文件指定节点的行号 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-05 11:20 |只看该作者 |倒序浏览
10可用积分
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bill_run>
        <xmlsum>
                <usg type="XP">
                        <sum>882</sum>
                        <d7>
                                <d7 type="M">
                                        <sum>882</sum>
                                </d7>
                        </d7>
                </usg>
        </xmlsum>
        <xmldtl>
                <rc>
                        <sum>4865</sum>
                        <fromdt>20090604</fromdt>
                        <todt>20090704</todt>
                        <d23>
                                <sum>4865</sum>                               
                        </d23>
                </rc>
                <usg type="XP">
                        <sum>882</sum>
                        <d7>
                                <sum>882</sum>                               
                        </d7>
                </usg>
                <dsc>
                        <sum>-756</sum>
                        <d5>
                                <sum>-756</sum>                               
                        </d5>
                </dsc>
        </xmldtl>
</bill_run>





有这个文件,怎么能找出<xmldtl>-><usg type="XP">-><sum>882</sum>行号呢?

我写了一个,但是要扫描整个文件,谁有更好的办法呢?或者谁能读取第1行到<xmldtl>-><usg type="XP">-><sum>882</sum>之间的数据?

awk 'BEGIN{a=0}/<xmldtl>/,/<usg type="XP">/{a=FNR}END{ print a+1}' tmp.xml

最佳答案

查看完整内容

awk '//{a=1;b=0;c=0} //{b=1;c=0} //{c=1} a*b*c{print NR;exit}' tmp.xml

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2009-11-05 11:20 |只看该作者
awk '/<xmldtl>/{a=1;b=0;c=0} /<usg type="XP">/{b=1;c=0} /<\/sum>/{c=1} a*b*c{print NR;exit}' tmp.xml

论坛徽章:
0
3 [报告]
发表于 2009-11-05 11:21 |只看该作者
XML有好多解析的包?

论坛徽章:
0
4 [报告]
发表于 2009-11-05 11:27 |只看该作者

回复 #2 ziggler 的帖子

是的,这个xml文件是用xerces生成的,xerces有缺陷啊,生成一个xml文件时候,每个节点都要占一块内存.如果这个xml文件很大,500多万个节点,内存不够用啊.

我现在就是一部分节点生成一个文件,然后再合并

论坛徽章:
0
5 [报告]
发表于 2009-11-05 11:39 |只看该作者
sed -n '/<xmldtl>/,/<\/xmldtl/{/<usg type="XP">/,/<\/usg>/{/<sum>882<\/sum>/=}}'

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2009-11-05 11:43 |只看该作者
这个意思?

awk '/<xmldtl>/,/<usg type="XP">/{if ($0~/<usg type="XP">/) {print NR+1;exit}}' tmp.xml

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
7 [报告]
发表于 2009-11-05 11:43 |只看该作者
试试xmlSmartlet工具

论坛徽章:
0
8 [报告]
发表于 2009-11-05 11:48 |只看该作者

回复 #5 beginner-bj 的帖子

恩!是这个意思,

多谢了,请帮忙再看下好么?

我刚才直接找到<usg type="XP">再读取下一行,有点武断了,如果
<usg type="XP">
      <sum>
            882
      </sum>
xml文件这样显示,要读</sum>的行号

论坛徽章:
0
9 [报告]
发表于 2009-11-05 11:50 |只看该作者

回复 #6 blackold 的帖子

好的,我先找点xmlSmartlet资料看看,哎,不过项目用的,应该不能随便更换.

我说xerces有缺陷,也可能是我没发现xerces解决这个问题.毕竟xerces是个很优秀的项目.

论坛徽章:
0
10 [报告]
发表于 2009-11-05 12:54 |只看该作者

回复 #2 beginner-bj 的帖子

多谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP