2013-03-14 16 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 
相關問題