【问题标题】:Can XmlStarlet preserve CDATA during copy?XmlStarlet 可以在复制期间保留 CDATA 吗?
【发布时间】:2013-03-14 02:44:00
【问题描述】:

如何让 XmlStarlet 在使用复制时保留 CDATA?必须维护<![CDATA[ ]]>,因为生成(和使用)数据的应用程序坚持要求围绕某些数据使用 CDATA 指令。

Example.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RSLogix5000Content SchemaRevision="1.0" SoftwareRevision="20.01" >
    <Controller Use="Target" Name="SOME_TARGET_NAME" ProcessorType="1789-L60">
        <Tags>
            <Tag Name="gstrScrap" TagType="Base" DataType="STRING" Constant="false" ExternalAccess="Read/Write">
                <Data>05 00 00 00 53 43 52 41 50 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00</Data>
                <Data Format="String" Length="5">
                    <![CDATA['SCRAP']]>
                </Data>
            </Tag>
        </Tags>
    </Controller>
</RSLogix5000Content>

使用命令;

xml sel -t -c "RSLogix5000Content/Controller/Tags/Tag" Example.xml

生成应用程序无法处理的数据,因为 &lt;![CDATA[ ]]&gt; 已从 'SCRAP' 周围删除;

<Tag Name="gstrScrap" TagType="Base" DataType="STRING" Constant="false" ExternalAccess="Read/Write">
                                <Data>05 00 00 00 53 43 52 41 50 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00</Data>
                                <Data Format="String" Length="5">
                                        'SCRAP'
                                </Data>
                        </Tag>

【问题讨论】:

  • CDATA 只是转义字符串的语法糖。你确定它是必要的吗?你测试过吗?如果需要 CDATA 部分,则 XML 要么不作为 XML 处理,要么被不符合 W3C XML 推荐的应用程序使用。
  • 是的,我已经通过在文本周围手动添加回 对其进行了测试。它被显然不符合 XML 标准的应用程序使用。

标签: copy cdata xmlstarlet preserve


【解决方案1】:

给你:

xml sel -t -c "RSLogix5000Content/Controller/Tags/Tag" Example.xml >t1.xml
xml ed -i "/Tag/Data/text()" -t text -n "" -v "<![CDATA[" t1.xml >t2.xml
xml ed -a "/Tag/Data/text()" -t text -n "" -v "]]>" t2.xml >t3.xml
sed -r "s/&lt;!\[CDATA\[/<![CDATA[/g; s/\]\]&gt;/]]>/g" t3.xml >t4.xml

您不需要sed,除非您的 xml 中有转义字符:

xml sel -t -c "RSLogix5000Content/Controller/Tags/Tag" Example.xml >t1.xml
xml ed -i "/Tag/Data/text()" -t text -n "" -v "<![CDATA[" t1.xml >t2.xml
xml ed -a "/Tag/Data/text()" -t text -n "" -v "]]>" t2.xml >t3.xml
xml unesc <t3.xml >t4.xml

【讨论】:

    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 2014-05-09
    • 2015-06-14
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2010-11-20
    相关资源
    最近更新 更多