2013-03-14 73 views
0

如何使XmlStarlet在使用副本时保留CDATA?必须维护<![CDATA[ ]]>,因为生成(并使用)数据的应用程序坚持要在某些数据周围使用CDATA指令。XmlStarlet可以在复制过程中保留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 

生成该应用程序不能处理由于<![CDATA[ ]]>从周围“碎料”除去数据;

<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> 
+0

'CDATA'只是为了转义字符串语法糖。你确定它一定需要吗?你测试过了吗?如果需要'CDATA'部分,则XML不会被处理为XML,或者被不符合W3C XML推荐的应用程序使用。 – jasso 2013-03-14 18:05:20

+0

是的,我已经通过在文本周围手动添加回进行了测试。它正被一个显然不符合XML标准的应用程序所使用。 – Jeff 2013-03-27 08:08:44

回答

0

在这里你去:

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 
相关问题