【问题标题】:Bash: Retrieve fields from complicated XML fileBash:从复杂的 XML 文件中检索字段
【发布时间】:2017-09-09 20:53:49
【问题描述】:

我尝试使用 sed、egrep、awk 等 shell 命令从结构复杂的 XML 文件中检索一些字段,但失败了。

这是我的文件 file.xml 的结构(它以不同的值重复了很多次):

<Task ID="186155128" Name="Partner: test" Active="1" NextEID="14" AR="0">
        <Schedules>
            <Schedule OnlyUntilFirstSuccess="0" FailIfNoSuccessInSched="0" RunEvenIfNotif="0">
                <Days>
                    <DayOfWeek>Monday</DayOfWeek>
                    <DayOfWeek>Tuesday</DayOfWeek>
                    <DayOfWeek>Wednesday</DayOfWeek>
                    <DayOfWeek>Thursday</DayOfWeek>
                    <DayOfWeek>Friday</DayOfWeek>
                    <DayOfWeek>Saturday</DayOfWeek>
                    <DayOfWeek>Sunday</DayOfWeek>
                </Days>
                <Frequency>
                    <Interval StartTime="00:00" EndTime="23:59" EveryMinutes="15"/>
                </Frequency>
            </Schedule>
        </Schedules>
        <Destination HostID="1027635962" Type="AS2" UseDefPartner="1" UseDefRetryCount="1" UseDefRetryTimeoutSecs="1" Filename="[OrigName]" RequestMDN="1" RequestSigned="0" />
        <Source HostID="165429109" Type="siLock" FolderID="" FolderType="-1" FolderName="home/test" FileMask="*.*" DeleteOrig="1" NewFilesOnly="0" SearchSubdirs="0" Unzip="0" />

</Task>

<MyID="1027635962" Host1="myhost" DefPartnerURL="https://site.site.com" Password="!s!f7xtVc=="/>
<FID="165429109" DotNET="1" Name="mytest" Host2="testy.com" Port="443" />

我想得到输出:Name;HostID;FolderName;Host1;Host2

有什么想法吗?

谢谢。

【问题讨论】:

  • 使用 XML/HTML 解析器(xmllint、xmlstarlet ...)。
  • 显示一个有效的 XML 文件。请将您想要的输出添加到您的问题中。
  • @Cyrus 谢谢,请看编辑
  • 除非有根元素,否则 XML 文件实际上是无效的。这里没有显示根元素,也没有显示Task 如何与您打算从中检索其他内容的MyIDFID 元素连接的任何联合父元素。除非您的源文件真的不是 XML(并且本身无法解析),否则您需要确保此处显示的示例是有效的。
  • 另外,&lt;MyId="..."/>` 无效——每个属性都需要有自己的名称,与包含它的元素不同。

标签: xml bash shell


【解决方案1】:

如果我们假设您的意思不是(无效)字符串&lt;MyID="1027635962" Host1="myhost"/&gt; 而是(有效)字符串&lt;MyID id="1027635962" Host1="myhost"/&gt;,当然还假设这两个数据都是有效文档的一部分,这可能看起来类似:

xmlstarlet sel -t -m '//Task' \
  -v ./@Name -o ';' \
  -v ./Source/@HostID -o ';' \
  -v ./Destination/@Filename -o ';' \
  -v '//MyID[@id=./Destination/HostID]/@Host1' -o ';' \
  -v '//FID[@id=./Source/HostID]/@Host2' -n \
  <in.xml >out.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2018-02-15
    • 1970-01-01
    • 2017-12-20
    • 2019-01-25
    • 1970-01-01
    • 2012-11-20
    • 2015-05-28
    相关资源
    最近更新 更多