我在Linux上有一个XML文件(response.xml),我试图使用awk/sed/grep等解析它。XML文件包含一些中文字符,我正在尝试获取FunCode的值
<FunCode>9000</FunCode>
在 Linux 上使用
view
或cat
:<?xml version='1.0' encoding='UTF-8'?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <ns31:UploadInboundResponseElement xmlns:ns31="http://www.example.com/schema/xyzWS"> <ns31:UploadInboundResult><?xml version="1.0" encodi®æå</Remark></Head></ATKCST>>unCode>9000</FunCode><Remark>æ¥æ¶æ°æ </ns31:UploadInboundResult> </ns31:UploadInboundResponseElement> </soapenv:Body> </soapenv:Envelope>
在 Linux 上使用
file
命令:$ file -b --mime-encoding response.xml $ utf-8
在使用记事本的 Windows 上,该文件如下所示。请注意,编码是 UTF-8:
<?xml version='1.0' encoding='UTF-8'?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <ns31:UploadInboundResponseElement xmlns:ns31="http://www.example.com/schema/xyzWS"> <ns31:UploadInboundResult><?xml version="1.0" encoding="UTF-8" ?><ATKCST><Head><FunCode>9000</FunCode><Remark>接收数据成功</Remark></Head></ATKCST></ns31:UploadInboundResult> </ns31:UploadInboundResponseElement> </soapenv:Body> </soapenv:Envelope>
然而,当我在 Windows 上使用任何网络浏览器打开文件时,它会显示这一点。请注意,编码为 ISO-8859-1:
<?xml version="1.0" encoding="ISO-8859-1"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <ns31:UploadInboundResponseElement xmlns:ns31="http://www.example.com/schema/xyzWS"> <ns31:UploadInboundResult> <?xml version="1.0" encoding="UTF-8" ?> <ATKCST> <Head> <FunCode>9000</FunCode> <Remark>接收数据成功</Remark> </Head> </ATKCST> </ns31:UploadInboundResult> </ns31:UploadInboundResponseElement> </soapenv:Body> </soapenv:Envelope>
所以该文件在浏览器中的格式正确,但我很困惑为什么 Linux 说该文件是 UTF-8 编码的,而在浏览器中它显示为 ISO-8859-1。
仅仅是因为"编码='UTF-8'"吗?
我的另一个(主要)问题是,在 Linux 上,我无法搜索和获取 FunCode 的值"9000"。
关于如何在 Linux 上格式化文件以便获得 FunCode 值的任何想法?我尝试使用"iconv",但这没有帮助。
你在 Linux 中看到的混乱很可能是由于终端配置错误造成的。给定您在记事本中看到的内容,您必须将 UploadInboundResult 解码为文本,将其重新解释为 XML,然后最终获取您的元素:
$ xmlstarlet sel -T -N ns='http://www.example.com/schema/xyzWS'
-t -v '//ns:UploadInboundResult' response.xml |
xmlstarlet sel -t -v '//FunCode' -n
9000