首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XMLStarlet不删除属性

XMLStarlet不删除属性
EN

Stack Overflow用户
提问于 2022-10-11 10:40:41
回答 1查看 40关注 0票数 -1

我希望保留xmlns:md并从xml中删除所有其他属性。但是,xmlstarlet未能删除这些属性。

代码语言:javascript
复制
xmlstarlet ed -d '/md:EntityDescriptor/@xmlns' <<< '<md:EntityDescriptor xmlns="urn:_" xmlns:md="_"></md:EntityDescriptor>'

预期:

代码语言:javascript
复制
<md:EntityDescriptor xmlns:md="_"></md:EntityDescriptor>
EN

Stack Overflow用户

发布于 2022-10-12 17:33:07

(响应小星标记。)

它们不是属性节点,而是名称空间节点,因此它们存在于namespace 轴心上,而不是attribute轴上。

对于您发布的输入文件,在编辑过程中转换为皮克斯格式将产生所需的输出(带有一个非封闭的空根元素):

代码语言:javascript
复制
$ xmlstarlet pyx file.xml | grep -v '^Axmlns urn:_' | xmlstarlet depyx
<md:EntityDescriptor xmlns:md="_"></md:EntityDescriptor>

如果输入是较大文件的一部分,请确保默认命名空间中不存在任何元素--即定界 to _ (下划线)前缀,因为它是在根元素中声明的:

代码语言:javascript
复制
xmlstarlet select -Q -t -c '(//_:*)[1]' file.xml
if test "$?" -eq 1; then
  xmlstarlet pyx file.xml | grep -v '^Axmlns urn:_' | xmlstarlet depyx
fi

如果没有找到,则select -Q返回1。请注意,grep可能会限制行长度,cf。getconf LINE_MAX

避免了pyx / depyx的一些问题,例如错误引用外部实体,注释中的特定字符作为字符实体引用输出,depyx输出非折叠的空元素。(备选案文:xml2 / 2xml)

如果xmlstarlet已经完成,

代码语言:javascript
复制
xmlstarlet edit --omit-decl --pf -d '//namespace::*[name()=""]' file.xml

应该按您的要求去做,但这只会给您带来一个FIXME: can't delete namespace nodes错误。

在本例中,xmlstarlet format-N (--nsclean)选项不会删除冗余的命名空间声明。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74026775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档