【问题标题】:trying to find/replcace char entity using perl xml::dom::node->expandEntityRefs()尝试使用 perl xml::dom::node->expandEntityRefs() 查找/替换字符实体
【发布时间】:2012-10-22 15:45:18
【问题描述】:

我正在编写一个 perl 脚本来对 xml 文件进行一些更改,我需要做的一件事是找到一个实体并替换另一个实体。

我要找

<myelement>&#x25aa;</myelement>

并替换为

<myelement>&#x2022;</myelement>

我正在尝试使用 XML::DOM::Node->expandEntityRefs() 函数,但没有任何运气。我基本上是在尝试这样做:

# $nodeMyElement declared at top of function, not shown
my $textNode = $nodeMyElement->getFirstChild();

my $sChildText = $textNode ->toString();
# when calling from main node, the string is just nothing
my $test = $nodeMyElement ->expandEntityRefs( $sChildText );

# 当从主包调用时出现错误:Can't use string ("XML::DOM::Node") as an ARRAY ref while "strict refs" in use at C:/Perl/site/lib /XML/DOM.pm 第 1244 行。 我的 $test2 = XML::DOM::Node->expandEntityRefs($sChildText);

关于我做错了什么的任何想法,或者解决这个问题的更好方法? 谢谢, bp

【问题讨论】:

  • 如果你提供了一个可运行的演示,我会四处寻找解决方案。

标签: xml perl


【解决方案1】:

我必须承认我不是回答这个问题的最佳人选,而且我不知道 XML::DOM。就我个人而言,我会使用Mojo::DOM,但这只是因为它是我所知道的。此外,我仍在努力赶上 unicode 的东西。这里所说的都是我想出的:

#!/usr/bin/env perl

use strict;
use warnings;

use v5.10;
use utf8::all;
use Mojo::DOM;

my $dom = Mojo::DOM->new->xml(1)->parse(<<'END');
<myelement>&#x25aa;</myelement>
END

$dom->find('myelement')
    ->grep(qr/\x{25aa}/)
    ->pluck(replace_content => "\x{2022}");

say $dom;

问题是我似乎无法回到&amp;#x 编码。我确信(?)必须有一种方法可以做到这一点,或者可能更好,迫使它一直保持这种状态。有人吗?

【讨论】:

  • 为什么一定要有?这两种形式是等价的,任何不这样认为的都是错误的。
  • @ikegami,也许你是对的。再说一次,我不是使用 unicode 的人。我自己的问题是我无法创建 OP 规范中给出的输出。或许答案是,这个结果已经足够好了。
  • 我可以使用这个来匹配字符: $sChildText = encode('us-ascii', $sChildText, Encode::FB_XMLCREF );
  • @badperson,您可以回答自己的问题并接受它。在这种情况下,如果您自己找到了答案,这对未来的读者来说是正确的做法,并表明您不再需要帮助。干杯!
  • @Joel:好的,仍在解决这个问题,我的解决方案有点问题,但我可能会发布(包括一个可运行的示例)以防它对其他人有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 2014-07-26
  • 2015-07-19
  • 2020-09-13
  • 2016-12-27
  • 1970-01-01
相关资源
最近更新 更多