我有一个像这样的 XML 文件(MyXML.xml):
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns3:GetAllInfoFromRest xmlns:ns2="http://com.lanuk.cfe/b2_7/service/objects" xmlns:ns3="http://com.lanuk.cfe/b2_7/service/operations">
1111,GH43567,Hamburger,GET,278598655,\n000001, ,Kunal,Bhyuo,Ramond,856 K. 98 Rd, , ,Tripura,AGT,INDIA,856987, ,S,S,S,8956,\666666
</ns3:GetAllInfoFromRest>
</S:Body>
</S:Envelope>
现在我需要从该 xml 中删除 SOAP 内容和所有标记属性,并仅获取字符串响应1111,GH43567,Hamburger,GET,278598655,\n000001, ,Kunal,Bhyuo,Ramond,856 K. 98 Rd, , ,Tripura,AGT,INDIA,856987, ,S,S,S,8956,\666666
。
awk
我怎样才能用or 做到这一点sed
?
我用这种方式尝试过:
$ xgawk -lxml 'XMLATTR["xmlns:ns3"]=="http://com.lanuk.cfe/b2_7/service/operations"{print $2}' MyXML.xml
但显然我犯了一些错误,因此它不起作用。有人可以提出其他解决办法吗?
答案1
sed/awk
真的是关于常用表达。查看stackoverflow 上的这个答案为什么用正则表达式解析 HTML/XML 是一个坏的主意。
对于 XML,您确实需要构建文档的 DOM,然后找到您的信息。有 cmdline 工具,例如XML之星允许您从 XML 文档中获取信息。
但不要尝试使用 sed/awk 来解析 XML
PS:当然,您也许可以创建一个简单的正则表达式来提取您在现实生活中遇到的文件所需的信息。例如,以下内容将打印文档的第五行,其中(在您的示例中)包含相关信息。
# stupid and naive approach:
sed '5!d' MyXML.xml
但这对文件的布局做出了假设,其中有没有什么与 XML 相关。它可能适用于给定文件的非常特定的生成器,但不能保证适用于遵循相同规则的任何 XML 文件结构(结构化数据就是 XML 的全部内容)