免费注册 查看新帖 |

Chinaunix

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

求助:shell怎么获取XML属性名称和属性值并打印出来? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-19 10:28 |只看该作者 |正序浏览
例如, XML文件:
<article>
  <title1>a1</titlel1>
  <title2>a2</titlel2>
  <title3>a3</titlel3>
</article>


怎么用shell得到如下输出:
title1::a1
title2::a2
title3::a3

小弟先谢谢了。

论坛徽章:
0
14 [报告]
发表于 2012-06-20 11:07 |只看该作者
明白了,谢谢

回复 13# personball


   

论坛徽章:
0
13 [报告]
发表于 2012-06-20 08:28 |只看该作者
回复 11# qiu0204


    = =,这是设置分隔符为<或>,你的源数据中属性行的行首是有空格的,所以$1就是空格。。

论坛徽章:
0
12 [报告]
发表于 2012-06-19 17:59 |只看该作者
谢谢分享。
回复 9# jils2013


   

论坛徽章:
0
11 [报告]
发表于 2012-06-19 17:58 |只看该作者
回复 7# personball


我是菜鸟,还需要请教下,请问这个XML文件的域是怎么分的呢?
$awk -F'<|>' '{if(NF>3){print $2 "::" $3}}' xmltext

命令中$2, $3应该是先输出$2再输出$3, 尽管输出结果是我想要的,但是这样$1是哪个呢?
谢谢  

论坛徽章:
0
10 [报告]
发表于 2012-06-19 17:41 |只看该作者
不过如果xml写作风格很统一的话,还是可以尝试的,但是想特别全面的处理xml文件,很难受

论坛徽章:
0
9 [报告]
发表于 2012-06-19 17:38 |只看该作者
本帖最后由 jils2013 于 2012-06-19 17:46 编辑

以前折腾过这个,xml文件格式感觉很自由
有些是<value name="abc">123</value>
有些又是<xxx><name>abc</name><value>123</value></xxx>
在我看来以上差不多,但是不同的人写来都一样;


其他的方面shell和xml也不一样,比如关键字符 shell里面的空格(类似的还有单引号双引号)在xml很随意到处都是,所以处理值以前,基本所有的类似shell敏感关键词都要做处理,非常难受;

show一个当时入值转义的小函数:
  1.       function strconvert(str)
  2.        {
  3.         gsub("\\\?","\\\?",str);
  4.         gsub("\\\$","\\\$",str);
  5.         gsub("\\\(","\\\(",str);
  6.         gsub("\\\)","\\\)",str);
  7.         gsub("\\\|","\\\|",str);
  8. #        print "@strconver@"str;
  9.         return str;
  10.        }
复制代码
这些还只是我有限遇到的几十个里面碰到的符号;
如果赶上有想象力不按规矩出牌的不知道会有什么特殊的东西;
当时折腾几个月,写出来的又臭又长,最后遇到一个,把一个超长数据库描述符 直接写在一个记录里;直接超出了hpux 上awk处理单行记录上限,太悲剧了

论坛徽章:
0
8 [报告]
发表于 2012-06-19 17:35 |只看该作者
回复 7# personball


     非常感谢,我改了下你第一次给我的代码,貌似也可以:


echo '<article>
  <name>a1</name>
  <gender>a2</gender>
  <education>a3</education>
</article>' |awk '/<name|gender|education+/{print gensub(/<([^>]+)>([^<]+)<\/.*/,"\\1::\\2",1)}'

论坛徽章:
0
7 [报告]
发表于 2012-06-19 17:03 |只看该作者
回复 6# qiu0204


    其实上面都说了,这个事情不适合用shell来做。。。
以下假定数据严格遵守
  1. <article>
  2. <name>xyz</name>
  3. <gender>female</gender>
  4. <education>degree</education>
  5. </article>
复制代码
这个形式
  1. personball@vostro:SHELL$awk -F'<|>' '{if(NF>3){print $2 "::" $3}}' xmltext
  2. name::xyz
  3. gender::female
  4. education::degree
  5. personball@vostro:SHELL$cat xmltext
  6. <article>
  7. <name>xyz</name>
  8. <gender>female</gender>
  9. <education>degree</education>
  10. </article>
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-06-19 16:33 |只看该作者

非常感谢你的答复。
如果属性名称没有规律,您给出的命令还又办法修改吗?比如XML问价如果是:

<article>
  <name>xyz</name>
  <gender>female</gender>
  <education>degree</education>
</article>

望您不吝赐教。多谢!
回复 5# yinyuemi


   
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP