Copy XmlStarlet能否在复制期间保留CDATA?
使用copy时如何使XmlStarlet保留CDATA?必须维护Copy XmlStarlet能否在复制期间保留CDATA?,copy,cdata,xmlstarlet,preserve,Copy,Cdata,Xmlstarlet,Preserve,使用copy时如何使XmlStarlet保留CDATA?必须维护,因为生成(和使用)数据的应用程序坚持在某些数据周围使用CDATA指令 Example.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <RSLogix5000Content SchemaRevision="1.0" SoftwareRevision="20.01" > <Controller Use="Target" Na
,因为生成(和使用)数据的应用程序坚持在某些数据周围使用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>
生成应用程序无法处理的数据,因为
已从左右的“废料”中删除
<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>
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
“废品”
给你:
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/<!\[CDATA\[/<![CDATA[/g; s/\]\]>/]]>/g" t3.xml >t4.xml
xmlsel-t-c“rslogix5000内容/控制器/标签/标签”Example.xml>t1.xml
xml ed-i“/Tag/Data/text()”-t text-n“-v”t2.xml>t3.xml
sed-r“s/!\[CDATA\[//g”t3.xml>t4.xml
除非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
xmlsel-t-c“rslogix5000内容/控制器/标签/标签”Example.xml>t1.xml
xml ed-i“/Tag/Data/text()”-t text-n“-v”t2.xml>t3.xml
xml unesc t4.xml
CDATA
只是转义字符串的语法糖。你确定需要它吗?你测试过吗?如果需要CDATA
部分,则XML不是作为XML处理,就是被不符合W3C XML建议的应用程序使用。是的,我已经通过手动添加回它被一个显然不符合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