XML :: LibXML을 사용하고 있습니다. XPath 컨텍스트를 만들 때 사용할 수있는 네임 스페이스를 정확하게 지정할 수 있어야합니다. 그러나 컨텍스트 노드의 범위에있는 모든 네임 스페이스는 XPathContext 개체에 자동으로 등록됩니다. 나는 그 등록을 취소해야하지만 내가 컨텍스트 노드의 범위에있는 네임 스페이스의 등록을 취소 할 때 오류가 발생합니다 :컨텍스트 노드의 범위에서 네임 스페이스 등록 해제
use XML::LibXML;
use XML::LibXML::XPathContext;
my $xml = <<'__EOI__';
<?xml version="1.0"?>
<myDoc id="myDocId">
<body id="bodyId">
<baz:par xmlns:baz="www.baz.com"
xmlns:bar="www.bar.com">
<bar:id>xyz123</bar:id>
</baz:par>
</body>
</myDoc>
__EOI__
my $parser = XML::LibXML->new();
my $doc = $parser->parse_string($xml);
my $xpc = XML::LibXML::XPathContext->new();
$xpc->registerNs('baz', 'www.baz.com');
my $par = ${ $xpc->findnodes('//baz:par', $doc) }[0];
my $xpc2 = XML::LibXML::XPathContext->new($par);
$xpc2->unregisterNs('bar');
위 croaks XPathContext: cannot unregister namespace
합니다. 원본을 검사하면 오류가 줄 7618 (LibXML.xs)에서 인쇄되는 것을 볼 수 있습니다. 함수 xmlXPathRegisterNs
이 -1을 리턴하면 인쇄됩니다. 이 함수에 대한 유일한 설명서는 xmlsoft.org에 있습니다. 이 설명서에서는 -1 반환 값은 오류가 있음을 의미하지만 오류가 발생하는 조건을 지정하지 않음을 나타냅니다. 나는 그 삶의 방식으로 그 방법의 근원을 찾을 수 없다.
XPath specification은이 특정 작업을 허용하지 않을 수도 있지만 그 결정도 불가능합니다.
XML :: LibXML :: XPathContext를 사용하여 컨텍스트 노드의 범위에서 네임 스페이스 등록을 취소 할 수있는 방법이 있는지 또는 b) XPath에서 허용되지 않는 문서가있는 경우 누구에게 말해 줄 수 있습니까?
편집
조엘은 수동으로 네임 스페이스를 등록하지 않은 경우 네임 스페이스를 등록 취소하는 경우에만 주어진 오류가 발생 내게 보여 주었다. 그러나, 등록 취소는 여전히 잘 작동하지 않습니다 다음 bar
네임 스페이스가 아직 등록되지 않았기 때문에이
$xpc2->registerNs('bar', 'nothing'); #otherwise unregistering throws an error
$xpc2->unregisterNs('bar');
my @nodes = $xpc2->find('bar:id');
print scalar @nodes; #I want '0', but this prints '1'
변환 후에 XML이 어떻게 나타나야하는지 보여 줄 수 있습니까? ''요소를 네임 스페이스 접두어없이''으로 쓰길 원합니까? –
죄송합니다. 프로그램이하는 일에 대해 분명히해야했는데 실제로는 아무 것도 아니 었습니다. 여기에는 변화가 없습니다. 난 그냥 던져 오류없이 '바'등록을 취소하고 싶습니다. –
하지만 직렬화가 없거나 나중에 다른 것이 있으면 등록 해제를 원하십니까? –