【发布时间】:2016-01-25 19:10:53
【问题描述】:
我是新手,有个很棒的编辑器叫做 - sed。
我想删除所有 xml 标签并在特定标签之间提取字符串 - reportBody
单行显示如下:
<?xml version="1.0" ?><SOAP- ENV:Envelope xmlns:SOAP-ENV="blablah"><SOAP-ENV:Body> <getReportResponsexmlns:msgns="blahblahblah" xmlns="blahblah"><returnxmlns=""> <returnCode><majorReturnCode>000</majorReturnCode><minorReturnCode>0000</minorReturnCode><returnCode><reportName>blahblah</reportName><reportTitle>blahblahblahr</reportTitle><reportBody>STRING TO EXTRACT</reportBody><reportMimeType>text/csv</reportMimeType></return></getReportResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
问题是xml文件可以不同,有时它写在一行中,或者写成2-3行,或者要提取的字符串将存储在reportBody标签之间的多于1行中。所以它可以是类似的,甚至是不同的:
<?xml version="1.0" ?><SOAP- ENV:Envelope xmlns:SOAP-ENV="blablah"><SOAP-ENV:Body>
`enter code here`<getReportResponsexmlns:msgns="blahblahblah" xmlns="blahblah">
<returnxmlns=""> <returnCode>
<majorReturnCode>000</majorReturnCode><minorReturnCode>0000</minorReturnCode>
<returnCode>
<reportName>blahblah</reportName><reportTitle>blahblahblahr</reportTitle><reportBody>
STRING
TO
EXTRACT</reportBody>
<reportMimeType>text/csv</reportMimeType></return>
</getReportResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
应对所有可能的变化的解决方案是什么? 另外,我可以设置参数来保存文件并将字符串解码为base64吗?谢谢!
【问题讨论】:
-
好主意,但是这个字符串可以包含比最大值更多的符号。字符串的值,所以xml解析器无法处理。
-
很遗憾您问题中的 XML 无效 - 我怀疑这只是您为我们准备示例的结果。如果它是有效的,那么正如@123 所建议的那样,你真的应该使用像
xmllint --xpath '//reportBody/text()' file.xml这样的命令。 -
它无效 :( 它来自一个 m2m 服务器,reportBody 内附有 base64 编码文件