从 XML 标记中删除空格

Posted

技术标签:

【中文标题】从 XML 标记中删除空格【英文标题】:Remove whitespace from XML tags 【发布时间】:2011-10-18 10:09:51 【问题描述】:

我正在尝试编写一个 perl 脚本,,但在值内留下空格。例如,假设我有:

<Example>This is an example.</Exampl   e>

我想要完成的是专门敲掉&lt;/Exampl e&gt; 中的空白。由于这将适用于整个 XML 文档,我想我会用替换运算符做一些事情,但我无法完全弄清楚如何只匹配可能在 XML 标记本身内部的空格。

非常感谢任何帮助!

编辑:我添加了一个真实的例子来说明正在发生的事情:

not well-formed (invalid token) at line 42, column 25, byte 1456:
                    <Artist>Eminem</Artist>
                    <FileName>eminem feat lil wayne - no love -
hotnewhiphop com(2).mp3</    FileName>
========================^
                    <FileSize>4804478</FileSize>

【问题讨论】:

基于此示例,XML 可能格式不正确。那是对的吗? (这对所需的方法有很大的影响。) 正确,在我解码包含 xml 数据的引用打印消息后出现问题。但是,根据所使用的架构,标签本身不应有任何空格。 你是怎么解码的?您是手动执行此操作还是使用 CPAN 的 MIME 工具(即MIME::Decoder)? -- 一开始就避免损坏东西总是比事后修补要好 我正在使用 MIME::QuotedPrint::Perl 的解码来处理文件,它会清理它(否则你会在某些行的末尾看到 =20)。如果我能告诉 RIAA 清理他们的 XML,那就太好了,但我怀疑他们会合作。 【参考方案1】:
s!(</?\w+)\s+(\w+\s+/?>)!$1$2!g;

如果您想在带有属性的标签中真正留下空格,它会变得更加复杂,因为空格是标签中的合法字符。您几乎必须找到后面没有等号或空格 + 等号的“单词”,并将它们与前一个--未引用--单词结合。

sub marry_inner_splits 
    my $_ = shift;
    # fix broken tags
    s|^/?(\w+)\s+(\w+)\b(?!\s*=)|$1$2|; 
    # find the resulting position.
    my $pos = index( $_, ' ' );
    # return if there is no whitespace.
    return $_ if $pos == -1;
    # bind the rest of the text to the substring
    substr( $_, $pos ) =~ s/(\s*\w+)\s+(\w+\s*=\s*(?:"[^"]+"|'[^']+')\s*)/$1$2/g;
    return $_;


my $tag_str = qSome stuff before the tag <ta g attr1="val1" att   r2="value #2"     /></Escap   e>;
$tag_str =~ s/<([^>]+)>/'<' . marry_inner_splits($1) . '>'/ge;

e 标志表示您在替换部件中是*eval*-ing。

【讨论】:

有布尔属性(无值),例如&lt;input type="checkbox" checked name="foo"/&gt; Qtax,那么它不是 XML。在 XML 中,所有属性都必须有引用值。【参考方案2】:

我强烈建议避免滚动您自己的 XML 解析,或尝试通过正则表达式等操作 XML。

使用众多可用的 XML 解析器中的一种,免去您的麻烦。

例如,查看XML::Easy、XML::Smart、XML::TreeBuilder、XML::Twig。

另请参阅http://perl-xml.sourceforge.net/faq/,了解有关使用 Perl 处理 XML 的非常全面的常见问题解答。

【讨论】:

如果它的格式不正确,请拒绝它,而不是试图以容易出现脆弱和意外破损的讨厌方式来处理它。 这就是我一直遇到的问题。我正在尝试解析来自各种来源的 DMCA 通知(似乎喜欢使用引用的打印消息来混淆 XML 本身)每次我尝试解析我收到的某些 XML 文档时,我都会得到由格式不正确的 XML 引起的无效令牌标签,我正在尝试修复。这些模块中的任何一个会修复这个问题或智能地解释空白吗? 您可以尝试通过例如运行 XML xmllint 看看它是怎么做的。不过,一般来说,我宁愿坚持“如果它不是有效的 XML,则拒绝它”的方法。 @Timothy,听起来您是在说您没有正确处理传输(或某些此类)编码。也许这就是我们应该关注的? 基本上发生的事情是,我必须使用 MIME::QuotedPrint::Perl 从包含 XML 的邮件消息中去除引用的打印,这通常有效,除了一些电子邮件看起来像他们行包装文本并跨行拆分一些标签或添加空格。

以上是关于从 XML 标记中删除空格的主要内容,如果未能解决你的问题,请参考以下文章

从 ASP Net Web API POST 请求中删除空的 xml 标记

如何使用 XSLT 从 XML 中删除元素标记

如何处理sql中xml标记之间的前导空格

TYPO3 CKEditor:防止删除两个 HTML 标记之间的空格

C# 正则表达式:将空格替换为 XML 标记

使用 XSLT 将 XML 转换为 CSV,用于在单个标记中以空格分隔的多个记录