【问题标题】:remove xml declaration from xml Data using perl or awk使用 perl 或 awk 从 xml 数据中删除 xml 声明
【发布时间】:2012-09-29 21:37:03
【问题描述】:

我们的应用程序在接收端对 XML 数据进行回溯分析。我们的应用程序没有可用的 Java 或 .NET,但在 Unix 中运行,所以它有 awk 和 Perl。

文件中的 XML 消息包含:

<?xml version="1.0" encoding="ISO-8859-1" ?> 

我在 Perl 和 awk 中尝试了一些选项来删除它们,但无法让它们工作:

perl -p -i -e "s/<?xml version="1.0" encoding="ISO-8859-1" ?>//g"  inputFile
perl -p -i -e "s/<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>//g"  inputFile
perl -p -i -e "s/<\?xml version="1.0" encoding="ISO-8859-1" \?>//g"  inputFile

还有其他使用 PERL 或 AWK 的选项吗?

【问题讨论】:

  • 您在“接收”XML 时是否使用了 XML 解析器? XML 声明对于解析器很有用,并且试图用解析器以外的任何东西处理任何重要的 XML 都会导致疯狂。而且,如果您使用的是 Unix,那么您可以使用各种语言,只要您安装它们。
  • 查看“How can I mine an XML document with awk, Perl, or Python?”以获得相关答案。
  • 您的 Perl 代码不起作用,因为 ? 是正则表达式元字符。在每种情况下将? 替换为. 或\?,您应该可以。
  • @JonathanLeffler:你是对的。但是我尝试了 perl -p -i -e "s///g" inputFile ,但仍然无法正常工作。我将添加到主要问题中
  • 糟糕 - 我没有注意到您将 -e 括在双引号中;我会自动使用单引号。这对我有用:perl -p -e 's/&lt;\?xml version="1.0" encoding="ISO-8859-1" \?&gt;//g'.

标签: xml perl awk xml-serialization xml-declaration


【解决方案1】:

这对我有用而不会覆盖数据文件:

perl -p -e 's/<\?xml version="1.0" encoding="ISO-8859-1" \?>//g'

当我确定基本的正则表达式可以正常工作且不会造成损坏时,我只会覆盖文件 (-i)。

【讨论】:

    【解决方案2】:

    如果您的文件是 XML,则不必匹配整个字符串。 &lt;?xml version 就够了。

    试试:

    sed -i '/<\?xml version/d' file
    

    测试

    kent$  echo '<?xml version="1.0" encoding="ISO-8859-1" ?> 
    foo
    bar
    xyz
    hello
    there'|sed '/<\?xml version/d' 
    foo
    bar
    xyz
    hello
    there
    

    【讨论】:

    • @以上,它没有用。 “sed:非法选项--i”。我尝试不使用“-i”选项,但它错误地截断了消息。
    • @diaryfolio 看到答案中的测试,它确实给了你想要的,不是吗?
    • $ cat inputFile.xml &lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;&lt;WEEKDAY&gt;&lt;day&gt;Monday&lt;day&gt;&lt;/WEEKDAY&gt; $ cat inputFile.xml | sed '/&lt;\?xml version/d' $ 似乎截断了整个消息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多