Linux 上使用中文字符的 XML UTF-8/ISO-8859-1 编码存在问题



我在Linux上有一个XML文件(response.xml),我试图使用awk/sed/grep等解析它。XML文件包含一些中文字符,我正在尝试获取FunCode的值

<FunCode>9000</FunCode>
  1. 在 Linux 上使用viewcat

    <?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>&lt;?xml version="1.0" encodi®æå&lt;/Remark>&lt;/Head>&lt;/ATKCST>>unCode>9000&lt;/FunCode>&lt;Remark>æ¥æ¶æ°æ
    </ns31:UploadInboundResult>
    </ns31:UploadInboundResponseElement>
    </soapenv:Body>
    </soapenv:Envelope>
    
  2. 在 Linux 上使用file命令:

    $ file -b --mime-encoding response.xml
    $ utf-8
    
  3. 在使用记事本的 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>&lt;?xml version="1.0" encoding="UTF-8" ?>&lt;ATKCST>&lt;Head>&lt;FunCode>9000&lt;/FunCode>&lt;Remark>接收数据成功&lt;/Remark>&lt;/Head>&lt;/ATKCST></ns31:UploadInboundResult>
    </ns31:UploadInboundResponseElement>
    </soapenv:Body>
    </soapenv:Envelope>
    
  4. 然而,当我在 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

最新更新