2010-01-04 2 views
2

사용할 수없는 네임 스페이스를 참조하는 XML 문서가 있습니다.어떻게하면 Perl의 LibXML로 잘못된 xmlns 네임 스페이스를 무시할 수 있습니까?

<microplateDoc xmlns="http://moleculardevices.com/microplateML"> 
...my data is here... 
</microplateDoc> 

위의 두 태그를 삭제하면 스크립트가 정상적으로 읽히지 만, 그렇지 않으면 완전히 읽지 않습니다. 그냥 무시하는 것이 좋습니까? 모든 입력 파일을 검토하고이 두 줄을 삭제하는 또 다른 스크립트를 작성하려고 생각하고 있지만 더 좋은 방법이있을 것이라고 생각합니다.

모든 데이터 파일을 살펴보고이 두 줄을 삭제 한 경우 스크립트를 사용하여 가장 좋은 방법은 무엇입니까? 나는 각 파일을 열어서, 그 용어를 검색하고, 파일을 삭제하고, 파일을 저장한다고 가정합니다. 더 나은 방법을 생각해 볼 수 있습니까? 감사.

+0

아마도 코드의 관련 부분을 게시 할 수 있습니다. 확실히 도움이 될 것입니다. 로버트 로스니 (Robert Rossney)가 말한 것처럼, 당신의 설명에 문제가 무엇인지 말하기는 불가능합니다. 그것은 완전히 유효한 네임 스페이스 선언입니다. 그래서 다른 무언가가 여기서 진행될 수 있습니다. –

+0

덕분에 도움을 청할 수 있으며, 아래에서 해결 된 문제를 해결할 수 있습니다. – John

답변

1

거기 네 네임 스페이스에 문제가 있다고 생각하지 않는다. 원하지 않는 부작용이 없다고 확신하지 않는 한 입력 파일을 망쳐 놓지 않을 것이다. 내가 생각하기에 이것은 일반적인 초보 XML 처리 실수이다. 네임 스페이스의 노드에 액세스하기 전에 네임 스페이스를 코드에 등록 (즉 접두사에 바인딩)해야한다.

http://perl-xml.sourceforge.net/faq/#namespaces_xpath은 유용한 예처럼 보입니다. 저는 일반적으로 Perl을 사용하지 않지만, 다른 언어에서 이런 현상이 발생하는 것을 보았습니다.

+0

많은 감사, 네가 맞았다. 네임 스페이스를 등록하지 못했다. 나는 잘못해서 특정 네임 스페이스에있는 변수 네임리스트가 네임 스페이스라고 생각했다. 내가 가리킨 웹 사이트에서 다음 두 줄을 추가했습니다. my $ xpc = XML :: LibXML :: XPathContext-> new ($ tree); $ xpc-> registerNs (microplateML => 'http://moleculardevices.com/microplateML'); 그것은 여전히 ​​100 % 작동하지 않습니다 {, 그러나 이것은 전혀 문제였다 foreach는 내 $의 카멜 리드 ('종 // microplateML') $ xpc-> findnodes을 (:) 는 지금은 이런 식으로 요소에 액세스 할 수 있습니다 결국 라인을 삭제해야합니다. 다시 한번 감사드립니다. – John

1

파일에서 줄을 제거하는 것과 관련하여 오늘 오늘 this exact question에게 질문했습니다. (그냥 일치하는 줄을 삭제하는 SED 옵션 -d 추가 할 수 있습니다.)

+0

링크 Ether에 감사드립니다. 파서에게이를 무시하도록 지시하는 방법이 있으면 다른 사람들의 의견을 듣고 싶습니다. 제거하는 것보다 훨씬 쉬울 것입니다. – John

+0

내 xml-fu는 현재 열악하다. 그래서 다른 사람들이 자비를 베풀어 두려워한다. :) – Ether

3

을 내가 네임 스페이스를 참조하는 XML 문서가 사용 가능한입니다 :

난 당신에 대해 혼란스러워 의심하지 무엇을 XML 네임 스페이스가 있습니다. 네임 스페이스는 Uniform Resource Identifier이며 RFC 3305를 준수하는 문자열입니다. URI (Uniform Resource) 로케이터은 URL이 모든 URI이므로 가능할 수도 있지만 반드시 그렇습니다.

중요한 것은 다음과 같습니다. XML 네임 스페이스가 http://으로 시작한다고해서 XML 파서가이를 찾지 못한다는 의미입니다. 그렇지 않습니다 (쓴 사람이 네임 스페이스가 무엇인지 이해하지 못하면 이보다 더 많은 문제가 발생할 것입니다).

이 XML 문서를 읽는 스크립트가 "모두 엉망이됩니다."라고 말하면 무슨 뜻인지 말할 수 없습니다. 그것을 무시해도 괜찮습니까? 그것은 아주 좋을지도 모른다. 결국 네임 스페이스의 목적 중 일부는 해당 문서의 일부 소비자가 무시할 수있는 정보를 XML 문서에 임베드 할 수있게하는 것입니다.

다른 한편으로는 이러한 파일을 사용하는 사람이 유일한 사람이 아니라면 다른 사람이 필요로하는 데이터를 삭제하여 큰 문제가 될 수 있습니다.

1

그래서 네임 스페이스가 xml 문서에 올바르게 접두사로 붙지 않았을 때 XML :: LibXML 모듈이 XML 파일/콘텐츠를 올바르게 구문 분석하지 않는다는 것을 나타냅니다. 해결 방법은 동적으로 네임 스페이스를 제거하는 것입니다. 다음과 같이 할 수 있습니다.

$ xml = ~ s/xmlns \ = ([\ S] +) // m;

0

당신이하는 XPath 같은 //*[name()="microplateDoc"]와 노드를 검색 할 수 있습니다 ""의 xmlns =로 시작하는 모든 것을 제거해야합니다. 희망이 작동합니다. 감사합니다. .

관련 문제