格式化XML文件

时间:2013-03-23 17:07:53

标签: xml unix sed awk grep

原始数据:

<?xml version="1.0"?>
<CascadedExtractFileData>
<Country>
<IsoCountryCode>IN</IsoCo
untryCode>
<Provider>
<ItuCode>CASCADED_PROV</ItuCode>
<AccessInterconnect>
<CASCADE
D_INTERCONNECT_ID>50</CASCADED_INTERCONNECT_ID>
<TailTechnology>
<CASCADED_ACCESS_
METHOD_ID>1</CASCADED_ACCESS_METHOD_ID>
</TailTec
hnology></Access
Interconnect></
Provider><
/Country>
</C
ascad
edExtractFileData>

必需如:

<?xml version="1.0"?>
<CascadedExtractFileData>
<Country>
<IsoCountryCode>
IN
</IsoCountryCode>
<Provider>
<ItuCode>
CASCADED_PROV
</ItuCode>
<AccessInterconnect>
<CASCADED_INTERCONNECT_ID>
50
</CASCADED_INTERCONNECT_ID>
<TailTechnology>
<CASCADED_ACCESS_METHOD_ID>
1
</CASCADED_ACCESS_METHOD_ID>
</TailTechnology>
</AccessInterconnect>
</Provider>
</Country>
</CascadedExtractFileData>

我需要新行上的每个标记<></>以及<>IN</>之间的数据,例如IN也在新线上。我需要一个结构完整的XML格式。

我需要使用Unix工具的解决方案:grepsedawk

2 个答案:

答案 0 :(得分:2)

此行将修复无效xml文件中的问题:

awk '{s=s $0}END{gsub(/></,">\n<",s);s=gensub(/>([^ \n>]*)</,">\n\\1\n<","g",s);print s}' file

输出:

<?xml version="1.0"?>
<CascadedExtractFileData>
<Country>
<IsoCountryCode>
IN
</IsoCountryCode>
<Provider>
<ItuCode>
CASCADED_PROV
</ItuCode>
<AccessInterconnect>
<CASCADED_INTERCONNECT_ID>
50
</CASCADED_INTERCONNECT_ID>
<TailTechnology>
<CASCADED_ACCESS_METHOD_ID>
1
</CASCADED_ACCESS_METHOD_ID>
</TailTechnology>
</AccessInterconnect>
</Provider>
</country>
</cascadedExtractFileData>

答案 1 :(得分:-1)

以下命令删除换行符(以修复XML标记),然后将结果传递给xmllint,它可以格式化结果:

cat data.xml | tr -d '\n' | xmllint -format -

关注输出:

<?xml version="1.0"?>
<CascadedExtractFileData>
  <Country>
    <IsoCountryCode>IN</IsoCountryCode>
    <Provider>
      <ItuCode>CASCADED_PROV</ItuCode>
      <AccessInterconnect>
        <CASCADED_INTERCONNECT_ID>50</CASCADED_INTERCONNECT_ID>
        <TailTechnology>
          <CASCADED_ACCESS_METHOD_ID>1</CASCADED_ACCESS_METHOD_ID>
        </TailTechnology>
      </AccessInterconnect>
    </Provider>
  </Country>
</CascadedExtractFileData>

更新

我的结果文件的格式与您的要求不一致,但我会提交格式更清晰。

从命令行操作XML时,xmllint程序是一个非常有用的工具。除了能够验证和格式化XML之外,它还可以用于使用xpath进行搜索。