Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从XML标记中删除空白_Xml_Regex_Perl_Whitespace_Xml Parsing - Fatal编程技术网

从XML标记中删除空白

从XML标记中删除空白,xml,regex,perl,whitespace,xml-parsing,Xml,Regex,Perl,Whitespace,Xml Parsing,我试图编写一个perl脚本,从XML标记中删除空白,但在值中保留空白。例如,假设我有: <Example>This is an example.</Exampl e> 这是一个例子。 我希望完成的是在中删除空白。由于这将对整个XML文档起作用,我想我应该使用替换操作符,但我不太明白如何只匹配XML标记本身内部的空白 非常感谢您的帮助 编辑:我添加了一个真实的例子来说明发生了什么: not well-formed (invalid token) at line 42

我试图编写一个perl脚本,从XML标记中删除空白,但在值中保留空白。例如,假设我有:

<Example>This is an example.</Exampl   e>
这是一个例子。
我希望完成的是在
中删除空白。由于这将对整个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>
第42行第25列字节1456的格式不正确(无效标记):
阿姆
阿姆·费特·利尔·韦恩-没有爱-
hotnewhiphop com(2).mp3
========================^
4804478

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

使用众多可用的XML解析器中的一个,省去了麻烦

例如,看看

另请参阅,以获取有关使用Perl处理XML的相当全面的常见问题解答。

s!()!$1$2!G
s!(</?\w+)\s+(\w+\s+/?>)!$1$2!g;
如果您想在带有属性的标记中实际保留空格,则会变得更复杂,因为空格是标记中的合法字符。你几乎必须找到后面没有等号或空格+等号的“单词”,并将它们与前面的-未引用的-单词相结合

子婚姻内部分割{
我的美元=班次;
#修复损坏的标签
s^/?(\w+)\s+(\w+)\b(?!\s*=)|$1$2 |;
#找到结果位置。
我的$pos=索引($);
#如果没有空格,则返回。
如果$pos==-1,则返回$;
#将其余文本绑定到子字符串
substr($389;,$pos)=~s/(\s*\w+)\s+(\w+\s*=\s*(?:“[^”]+“|”[^']+')\s*)/$1$2/g;
返回$\;
}
我的$tag_str=q{标记前的一些东西};
$tag_str=~s/]+)>/''/ge;

e
标志意味着您正在替换零件中*
eval
*-ing。

基于此示例,XML可能格式不正确。是否正确?(这对所需的方法产生了很大的影响。)正确,在我解码包含xml数据的带引号的打印消息后会出现问题。但是,基于所使用的架构,标记本身不应该有任何空格。您是如何进行解码的?您是手动执行还是使用CPAN的MIME工具(即,
MIME::Decoder
)?--一开始最好避免损坏,而不是事后修补。我使用MIME::QuotedPrint::Perl的解码来处理文件,它会将文件清理干净(否则在某些行的末尾会看到=20)。如果我能告诉RIAA清理他们的XML,那就太好了,但我怀疑他们是否会合作。如果XML格式不好,就拒绝它,而不是试图用令人讨厌的方式咀嚼它,因为这样容易造成脆弱性和意外破坏。这是我一直遇到的问题。我正在尝试解析来自各种来源的DMCA通知(似乎喜欢使用引用的打印消息,这会弄乱XML本身)每次我尝试解析收到的某些XML文档时,我都会收到由格式不正确的XML标记引起的无效标记,我正在尝试修复这些标记。这些模块中是否有任何模块可以修复该问题或智能地解释空白?您可以试着通过例如xmllint运行XML,看看它的作用。一般来说,我宁愿站在如果它不是有效的XML,那么拒绝它”的方法。@Timothy,听起来好像你在说你没有正确处理传输(或类似的)编码。也许这就是我们应该关注的问题?本质上,我必须使用MIME::QuotedPrint::Perl从包含XML的邮件消息中去除quoted print,这通常是有效的,除了一些电子邮件看起来像是对文本进行了换行,并跨行拆分了一些标记或添加了空格。有布尔属性s(不带值),例如
Qtax,则它不是XML。在XML中,所有属性都必须有带引号的值。
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 = q{Some stuff before the tag <ta g attr1="val1" att   r2="value #2"     /></Escap   e>};
$tag_str =~ s/<([^>]+)>/'<' . marry_inner_splits($1) . '>'/ge;