0

我正在处理 XML 文档,我需要打开它并将同一行上的某些特定标记值转换为大写。如果我有相同的单词,它只会替换其中一个,尽管我使用了两个不同的 if 循环:这是我的 XML:

<pageID="1" width="827" height="1169" Sender_Company="société" Sender_Address="société" Sender_Fax="" Category="C2" Language_2="" Document_Object="" Language_1="french" Language_3="" NumPage="1" Script_1="typed">

这是我的代码:

while (<FILEIN>) {
    if ($_ =~ /pageID="1"/) {
        $haschanged = 1;
        if ($_ !~ /Sender_Address=""/) {
            if ($_ =~ /(Sender_Address="(.*?)")/){
                my $SenderAddress = $2;
                $SenderAddress = uc($SenderAddress);
                $_ =~ s/$1/Sender_Address="$SenderAddress"/;
            }
        }

        if ($_ !~ /Sender_Company=""/) { 
            if ($_ =~ /(Sender_Company="(.*?)")/) { 
                my $SenderCompany = $2;
                $SenderCompany = uc($SenderCompany);
                $_ =~ s/$1/Sender_Company="$SenderCompany"/;
                #print "$_\n";
            }
        }
    }
}

当我使用两个不同的值Sender_Company="bla"并且Sender_Address="société"转换为大写时有效,但是当我在这种情况下使用相同的单词Sender_Company="société"并且Sender_Address="société"它不会转换为大写时。有没有人有任何想法?当我一次使用两个不同的 if 循环时,我找不到它不想转换同一个单词的逻辑。谢谢!

4

1 回答 1

2

您对 XML 的理解有点值得商榷:

  1. 那不是 XML。它最多是一个 XML 片段(元素未关闭,标签名称不能兼作属性,如<pageID="1">,没有<?xml ...?>声明,没有根元素,......)
  2. 不要使用正则表达式解析 XML ;-)
  3. XML 没有“行”的概念。

除此之外,代码应该可以正常工作。请注意,您可以使您的生活变得轻松,并且您的代码很短:

  1. $_ =~ /foo/与 相同/foo/$_ !~ /foo/与 相同!/foo/
  2. 无需提取两个捕获并将结果替换为第二个正则表达式,您只需一步即可完成所有操作:

    s{ (?<=Sender_Address=") ([^"]+) (?=") }{ uc $1 }ex
    

    等等,什么?我提取了一个或多个非"字符,这些字符前面是字符串Sender_Address=",后面是"(环顾断言)。我捕获之间的东西,并将其替换为大写版本。因为我匹配至少一个字符,我不必测试空标签的情况。该/e标志允许替换中的代码(这里不是必需的),并且/x允许我们包含不匹配的空格以更好地格式化。

    您可以轻松地将其扩展为您想要大写的两个属性:

    # This subsumes your whole logic inside `if (/pageID="1"/)`
    $haschanged = 1;
    for my $attr (qw/Sender_Address Sender_Company/) {
      s{ (?<=\Q$attr\E=") ([^"]+) (?=") }{ uc $1 }ex;
    }
    

    \Q...\E会导致插值的内容按字面意思匹配,即使它包含否则会是正则表达式元字符的字符。

还有一些剩余的错误:

  1. 您无法将作为实体给出的大写字符。
  2. XML 允许将单引号'...'用作标记值分隔符。你不处理它们
  3. 请参阅您对 XML 的理解下的要点……</li>

所有这些都可以通过使用 XML 解析器,然后转换 DOM 中的属性来解决。

于 2013-03-18T12:34:32.777 回答