将 xml 转换为键值对表示法

2023-12-31

I use xmlstarlet el -v显示 xml 文件的结构,包括所有属性和值。我想将其输出转换为某种键值对,即每个属性及其值位于单独的行上(包括 XPath);每行必须是唯一的。

<?xml version=1.0 encoding=UTF-8?>
<topRoot>
  <topSystem>
    <commSvcEp>
      <commSyslog descr="Syslog Service" name="syslog" policyOwner="local" severity="critical">
        <commSyslogClient adminState="disabled" forwardingFacility="local7" hostname="none" name="secondary" severity="critical"></commSyslogClient>
        <commSyslogClient adminState="disabled" forwardingFacility="local7" hostname="none" name="tertiary" severity="critical"></commSyslogClient>
        <commSyslogClient adminState="disabled" forwardingFacility="local7" hostname="none" name="primary" severity="critical"></commSyslogClient>
      </commSyslog>
    </commSvcEp>
  </topSystem>
</topRoot>

当前结果:

topRoot/topSystem/commSvcEp/commSyslog[@descr='Syslog Service' and @name='syslog' and @policyOwner='local' and @severity='critical']
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[@adminState='disabled' and @forwardingFacility='local7' and @hostname='none' and @name='secondary' and @severity='critical']
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[@adminState='disabled' and @forwardingFacility='local7' and @hostname='none' and @name='tertiary' and @severity='critical']
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[@adminState='disabled' and @forwardingFacility='local7' and @hostname='none' and @name='primary' and @severity='critical']

期望的结果(可能是任何类似的结果;索引只是一个想法):

topRoot/topSystem/commSvcEp/commSyslog@descr='Syslog Service'
topRoot/topSystem/commSvcEp/commSyslog@name='syslog'
topRoot/topSystem/commSvcEp/commSyslog@policyOwner='local'
topRoot/topSystem/commSvcEp/commSyslog@severity='critical'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[0]@adminState='disabled'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[0]@forwardingFacility='local7'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[0]@hostname='none'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[0]@name='secondary'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[0]@severity='critical'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[1]@adminState='disabled'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[1]@forwardingFacility='local7'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[1]@hostname='none'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[1]@name='tertiary'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[1]@severity='critical'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[2]@adminState='disabled'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[2]@forwardingFacility='local7'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[2]@hostname='none'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[2]@name='primary'
topRoot/topSystem/commSvcEp/commSyslog/commSyslogClient[2]@severity='critical'

我想要实现的目标是能够跑步diff超过两个这样的文件或使用grep过滤匹配模式。我确信有一种方法可以创建这样的输出,而不使用sed, awk或除此之外的其他任何东西xmlstarlet itself.

对于 xmlstarlet 和整个 xml 世界,我几乎是一个新手(不仅仅是因为我不喜欢 xml,因为它的复杂性和解析开销等),所以我非常感谢您的帮助。谢谢!


既然你已经在使用xmlstarlet,您也可以使用 XSLT。

XSLT 1.0(可以通过使用 xmlstarlet 来运行tr命令)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>

    <xsl:param name="sep" select="'.'"/>

    <xsl:template match="text()"/>

    <xsl:template match="*">
        <xsl:variable name="path">
            <xsl:for-each select="ancestor-or-self::*">
                <xsl:variable name="predicate">
                    <xsl:call-template name="genPredicate"/>
                </xsl:variable>
                <xsl:if test="ancestor::*">
                    <xsl:value-of select="$sep"/>
                </xsl:if>
                <xsl:value-of select="concat(local-name(),$predicate)"/>
            </xsl:for-each>
        </xsl:variable>
        <xsl:for-each select="@*">
            <xsl:value-of select="concat($path,$sep,name(),'=',.)"/>
            <xsl:text>&#xA;</xsl:text>
        </xsl:for-each>
        <xsl:if test="not(@*)">
            <xsl:text>&#xA;</xsl:text>          
        </xsl:if>
        <xsl:apply-templates select="node()"/>
    </xsl:template>

    <xsl:template name="genPredicate">
        <xsl:if test="preceding-sibling::*[local-name()=local-name(current())] or following-sibling::*[local-name()=local-name(current())]">
            <xsl:value-of select="concat('[',count(preceding-sibling::*[local-name()=local-name(current())])+1,']')"/>          
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

注意:有一个参数名为sep所以你可以从命令行更改分隔符(使用-p sep="/"或任何你想要的分隔符)。当前设置为您首选的“.”。

Output

commSyslog.descr=Syslog Service
commSyslog.name=syslog
commSyslog.policyOwner=local
commSyslog.severity=critical
commSyslog.commSyslogClient[1].adminState=disabled
commSyslog.commSyslogClient[1].forwardingFacility=local7
commSyslog.commSyslogClient[1].hostname=none
commSyslog.commSyslogClient[1].name=secondary
commSyslog.commSyslogClient[1].severity=critical
commSyslog.commSyslogClient[2].adminState=disabled
commSyslog.commSyslogClient[2].forwardingFacility=local7
commSyslog.commSyslogClient[2].hostname=none
commSyslog.commSyslogClient[2].name=tertiary
commSyslog.commSyslogClient[2].severity=critical
commSyslog.commSyslogClient[3].adminState=disabled
commSyslog.commSyslogClient[3].forwardingFacility=local7
commSyslog.commSyslogClient[3].hostname=none
commSyslog.commSyslogClient[3].name=primary
commSyslog.commSyslogClient[3].severity=critical
commSyslog.commSyslogMonitor.adminState=disabled
commSyslog.commSyslogMonitor.descr=
commSyslog.commSyslogMonitor.name=
commSyslog.commSyslogMonitor.severity=critical
commSyslog.commSyslogConsole.adminState=disabled
commSyslog.commSyslogConsole.descr=
commSyslog.commSyslogConsole.name=
commSyslog.commSyslogConsole.severity=critical
commSyslog.commSyslogSource.audits=disabled
commSyslog.commSyslogSource.descr=
commSyslog.commSyslogSource.events=disabled
commSyslog.commSyslogSource.faults=enabled
commSyslog.commSyslogSource.name=
commSyslog.commSyslogFile.adminState=enabled
commSyslog.commSyslogFile.descr=
commSyslog.commSyslogFile.name=messages
commSyslog.commSyslogFile.severity=critical
commSyslog.commSyslogFile.size=4194304
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 xml 转换为键值对表示法 的相关文章

  • 将 LINQ 嵌套到 XML

    我有一些来自遗留应用程序的非标准 XML
  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • 如何在 MessageContract 类型中使用 XML 属性?

    前面的注释 我无法更改传入的 SOAP 请求的格式 因为它们是由国际标准固定的 weeeeeeeee 我有一个 SOAP 请求进入我的 WCF 服务 如下所示
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • Text::平衡和多行 xml

    看来我有点失落了 我需要解析一个大的 大约 100 mb 且相当难看的 xml 文件 如果我使用parsefile 它返回错误 文档元素后的垃圾 但它会很乐意解析文件的较小元素 所以我决定将文件分解为元素并解析它们 由于不鼓励使用正则表达式
  • 合并xml文档

    我遇到的所有关于合并 XML 文档的解决方案都无法实现我的愿望 让我解释 XML 文档 1 a b title Original Section b title Original Child Section b b title Origin
  • & 在 XML 代码中导致错误的符号

    我有以下 XML 代码 用于过滤我的 Crm Dynamics 表单中的查找字段 该过滤器根据输入帐户字段的数据使用 但是 帐户字段可以包含 符号 当出现时 会发生错误 表明 XML 格式不正确 有人有解决问题的办法吗 function a
  • 如何更换HXT中的节点?

    给定一个示例 xml 文件
  • 如何从 MySQL 数据查询创建 XML 文件?

    我想知道一种仅使用 MySQL 查询创建 XML 文件的方法 根本不使用任何脚本语言 有关于这个主题的书籍 教程吗 UPDATE 我想澄清一下 我想使用 sql 查询将 XML 数据转发到 php 脚本 Here s 关于从 MySQL S
  • 增强 XML 解析复杂性 - c# XML 循环

    我正在编写自己的 C 自定义地图导航程序 我在用打开街道地图用于地图数据 它是一个包含节点和方法的大型 XML 文件 我编写了一个转换器 可以从 XML 文件中去除无用的垃圾 如时间戳 用户等 这样文件就会变得更小 现在 当我尝试循环 XM
  • 膨胀类 android.support.design.widget.CoordinatorLayoute 时出错

    我正在尝试运行我的应用程序 但不断收到标题中列出的错误 我读过周围的内容 人们说尝试将主题更改为 AppCombat 主题 但这似乎不起作用 以下是我遇到的错误 Process com example jmeyer27 crazytiles
  • 在 javascript 中使用 xPath 解析具有默认命名空间的 XML

    我需要创建一个 XML xPath 解析器 所有解析都必须在客户端进行 使用 JavaScript 我创建了一个 javascript 来执行此操作 在默认名称空间发挥作用之前 一切看起来都正常 我根本无法查询具有默认命名空间的 XML 我
  • 如果 xmlwriter 是推荐的,那么 xmltextwriter 的用途是什么

    As per MSDN http msdn microsoft com en us library vstudio kkz7cs0d 28v vs 100 29 aspx 尽管 Microsoft NET Framework 包含 XmlT
  • 如何在 C# 中应用 XSLT 样式表

    我想使用 C 将 XSLT 样式表应用到 XML 文档 并将输出写入文件 我在这里找到了一个可能的答案 http web archive org web 20130329123237 http www csharpfriends com A
  • 将 XML 文档插入到另一个 XML 文档上的特定节点 (java)

    我有一个 XML1
  • XML获取所有同名节点

    我有如下所示的 xml 文档
  • 通过 post 使用 php 发送 XML

    我知道有很多类似的问题 但我尝试过摆弄所有的解决方案 但似乎无法使其发挥作用 我正在尝试将 xml 直接发布到 Web 服务并获得响应 从技术上讲 我正在尝试连接到freightquote com 您可以在右上角找到该文档this http
  • 当首选项屏幕启动时,Android 应用程序立即崩溃

    我一直在为应用程序开发首选项屏幕 但我什至没有让它在崩溃之前显示屏幕 我已经检查了几个关于共享首选项的教程 我的代码与他们的类似 但没有任何效果 我认为问题出在我的preferences xml 文件中 因为我注释掉了除了Preferenc
  • 从标签中提取 HTML5 数据属性

    我想从标签中提取所有 HTML5 数据属性 就像这个 jQuery 插件 http www orangesoda net jquery dataset html 例如 给定 span class highlight Joe Bloggs s
  • 在另一个布局中以编程方式膨胀布局

    我的 Android 应用程序需要帮助 我需要在另一个布局中膨胀一个布局 但我不知道该怎么做 我的xml代码是这样的 item xml 我需要膨胀多个 xml 取决于可变数量

随机推荐

  • 在 javascript 中获取推荐 url

    我想看看我从各种 URL 缩短服务 例如 bit ly tinyurl com 但由于它们使用 301 重定向 因此不会出现在我的分析中 如何找出谁在重定向流量 Or 更准确地说 我如何在 javascript 中获取不同类型重定向的推荐
  • std::unique_ptr 如何没有大小开销?

    如果空类的大小不能为 0 那么 std tuple 有何魔力 使得 unique ptr 的 sizeof 在 64 位机器中返回 8 在 unique ptr 中 成员定义为 typedef std tuple
  • 实体框架:在没有导航属性的情况下映射外键?

    动机 我的 EF4 1 DbContext 以错误的顺序保存实体 原因 我的模型缺乏导航属性 我想如何解决它 我想在 DbContext 中设置外键关系 问题是我的实体对象没有导航属性 我使用它来填充 Web 服务 然后将 DTO 对象触发
  • tweepy.errors.Forbidden:403 Forbidden - 使用 Tweepy 的 Twitter API 身份验证问题

    我正在遇到 tweepy errors Forbidden 403 Forbidden When authenticating requests to the Twitter API v2 endpoints you must use ke
  • df.duplicated() 误报?

    我有一个数据框 包含 2 865 044 个条目 具有 3 级多重索引 MultiIndex levels names year country productcode 我正在尝试重塑数据框以生成宽数据框 但出现错误 ReshapeErro
  • Xamarin iOS - 以编程方式加载故事板参考

    我有 2 个故事板 Activities storyboard and Contacts storyboard On Contacts storyboard我有一个视图控制器 ContactDetails On Activities sto
  • CSS 转换未触发

    我正在创建一个 DOM 元素 一个 div 将其添加到 DOM 然后在 javascript 中快速更改其宽度 理论上 这应该会触发 CSS3 转换 但结果是直接从 A 到 B 而没有中间的转换 如果我通过单独的测试单击事件更改宽度 一切都
  • 显示任意大小的位图而不会耗尽内存

    如何在不出现 OOMing 或缩小图像尺寸的情况下显示任意大小的图像 我不想因为缩放和拖动图片而缩小尺寸 如果无法显示任意大小的图像 如何确定要显示的图像的最大可能大小 而不导致 ROOM 位图数据分配在 Native 堆中 而不是 VM
  • react-native-image-picker launchCamera 在 android 中不起作用

    我在用着 react native image picker 3 0 1 在本机反应中捕获图像 但我在 android 9 中打开相机时出错 我收到错误 errorCode others errorMessage This library
  • SQL合并语句

    我正在尝试使用 SQL Server 2008 中新的 MERGE 语句 该语句将从临时表中获取记录 并在其他表中更新相同的记录 该语句如下 create table TempTable ProcPOAmdDel ProcessAmendm
  • Ionic:管理多个 iOS 版本

    我有一个离子应用程序 用于为不同组织构建同一应用程序的多个版本 gulp 脚本为我交换了所有的 asset config xml 这对于 Android 来说效果很好 因为我在签名时将 apk 输出到单独的文件夹中 但我不确定如何在 iOS
  • 为什么枚举常量必须在枚举类型中的任何其他变量和方法声明之前声明?

    如果我在声明枚举常量之前或没有以这种方式声明变量 enum MyEnum int i 90 它显示以下编译错误 MyEnum java 3
  • Android向项目添加外部库

    我有一个项目 我想添加外部库 并将它们与应用程序打包在一起 但我不确定它是否发生 我在这个链接上读到 https developer android com guide appendix faq commontasks html https
  • NSPopUpButton、NSComboBox 类似菜单

    我正在尝试创建一个带有下拉菜单的菜单 每个单元格都有自定义背景 首先 我尝试改编 NSPopUpButton 但我找不到更改单元格背景图像的方法 使用 setImage 会将文本滑动到背景的右侧 接下来我停在 NSComboBox 但我找不
  • 如何将 rune 转换为 unicode-style-string,如 Golang 中的 `\u554a`?

    如果你跑fmt Println u554a 显示 啊 但是如何获取 unicode style string u554a来自符文 啊 package main import fmt import strconv func main quot
  • “MKS 源完整性”有责备/注释吗?

    我正在通过 MKS Source Integrity 专有的 VCS MKS Integrity 的前身 访问 Windows 上控制的一些源代码 如何找出源代码的特定行最后更改的版本 根据 VCS 该功能被称为 责备 或 注释 更新 20
  • 将列值从 VARCHAR(n) 转换为 DECIMAL 时出现问题

    我有一个 SQL Server 2000 数据库 其中有一列类型为 VARCHAR 255 所有数据要么为 NULL 要么为最多两点精度的数字数据 例如 11 85 我尝试运行以下 T SQL 查询 但收到错误 将数据类型 varchar
  • 机器人在网格中移动

    机器人位于 4x4 网格的左上角 机器人可以上下左右移动 但不能两次访问同一地点 机器人正在尝试到达网格的右下角 它可以到达网格右下角的方法有多少种 现在我知道 如果机器人只能向下或向右移动 那么答案将是 8C4 因为它必须以任何顺序向右移
  • bootstrap-vue 改变 的位置

    默认情况下
  • 将 xml 转换为键值对表示法

    I use xmlstarlet el v显示 xml 文件的结构 包括所有属性和值 我想将其输出转换为某种键值对 即每个属性及其值位于单独的行上 包括 XPath 每行必须是唯一的