【问题标题】:Formatting XML file [closed]格式化 XML 文件 [关闭]
【发布时间】:2013-03-13 10:44:09
【问题描述】:

原始数据:

<?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>

我需要每个标签 &lt;&gt;&lt;/&gt; 在一个新的行和 &lt;&gt;IN&lt;/&gt; 之间的数据,例如IN 也在新的一行。我需要一个结构完美的 XML 格式。

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

【问题讨论】:

  • 如果您的系统有xmllint,请检查其选项。许多人可以选择重新格式化(缩进),但这会更容易修复。祝你好运。

标签: xml unix sed awk grep


【解决方案1】:

此行将修复无效 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>

【讨论】:

  • 嗨..感谢您的回复..你能解释一下它是如何工作的..我没有得到:-(
  • 嗨 Kent...我在执行 ..awk 时收到以下错误:第 1 行附近的语法错误 awk:第 1 行附近的非法语句 awk:第 1 行附近的语法错误 awk:第 1 行附近的非法语句1
  • @user2202766 我在你的问题中使用了完全相同的文本,我得到了这个输出。你需要 gnu awk 来运行这条线。我的 awk 代码首先处理空元素,将它们放在新行中。第二步,我处理了那些带有值的标签。
  • 谢谢 Kent.. 但我的问题与您预期的有点不同..如果标签之间的某些数据(如 example 中的文本“示例”分为两部分)我需要将它组合起来并将其放在一行中,例如 \n example \n \n .. 可以请提供一个想法..
  • @user2202766 我的 awk 行也是这样做的。即使您将每个字符都放在一行中,它也可以毫无问题地工作。因为它进行预处理,这意味着它首先将所有文本放入一行,然后开始处理。因此,您的输入如何分成几行并不重要。
【解决方案2】:

以下命令删除换行符(以修复 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 进行搜索。

【讨论】:

  • 这不符合要求的输出(加上UUoC
  • @sudo_O 无需侮辱。你的回答也不是天才。
  • 我不认为指出不正确的答案是不正确的侮辱!?无论您是否认为我的回答是天才,它都可以满足您的要求,与您的不同。
  • @sudo_O 让提问者决定。请让我们保持专业。
  • 提出问题的人清楚地指定了输出的格式。根据 stackoverflow 指南,我对您的答案投了反对票,因为它没有执行所要求的操作,并就原因留下了评论。我不知道你为什么表现得如此防守。 专业的做法是修正或删除你的答案。
猜你喜欢
  • 2021-01-23
  • 2010-11-28
  • 2023-03-25
  • 1970-01-01
  • 2010-12-21
  • 2011-06-18
  • 2016-08-26
  • 2011-10-10
  • 2011-02-26
相关资源
最近更新 更多