2016-08-28 2 views
0

nokogiri를 사용하여 docx의 문서 xml 파일에 액세스하고 있습니다. 여기 nokogiri를 사용하여 document.xml에서 깊은 중첩 노드에 액세스

그것의 샘플입니다

<w:document> 
    <w:body> 
     <w:p w:rsidR="00454EDC" w:rsidRDefault="00454EDC" w:rsidP="00454EDC"> 
       <w:drawing> 
        <wp:inline distT="0" distB="0" distL="0" distR="0"> 
         <wp:extent cx="1926590" cy="1088571"/> 
         <wp:effectExtent l="0" t="0" r="0" b="0"/> 
         <wp:docPr id="1" name="Picture 1"/> 
         <wp:cNvGraphicFramePr> 
          <a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1"/> 
         </wp:cNvGraphicFramePr> 
         <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"> 
          <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture"> 
           <pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture"> 
            <pic:nvPicPr> 
             <pic:cNvPr id="0" name="Picture 1"/> 
             <pic:cNvPicPr> 
              <a:picLocks noChangeAspect="1" noChangeArrowheads="1"/> 
             </pic:cNvPicPr> 
            </pic:nvPicPr> 
            <pic:blipFill> 
             <a:blip r:embed="rId5" cstate="print"> 
              <a:extLst> 
               <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}"> 
                <a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0"/> 
               </a:ext> 
              </a:extLst> 
             </a:blip> 
             <a:srcRect/> 
             <a:stretch> 
              <a:fillRect/> 
             </a:stretch> 
            </pic:blipFill> 
            <pic:spPr bwMode="auto"> 
             <a:xfrm> 
              <a:off x="0" y="0"/> 
              <a:ext cx="1951299" cy="1102532"/> 
             </a:xfrm> 
             <a:prstGeom prst="rect"> 
              <a:avLst/> 
             </a:prstGeom> 
             <a:noFill/> 
             <a:ln> 
              <a:noFill/> 
             </a:ln> 
            </pic:spPr> 
           </pic:pic> 
          </a:graphicData> 
         </a:graphic> 
        </wp:inline> 
       </w:drawing> 
      </w:p> 
    </w:body> 
</w:document> 

지금 나는 모든 <w:drawing> 태그에 액세스하고 싶은 그들에게서 나는 <a:blip> 태그를 액세스 및 R의 속성 값을 추출하기 위해 완 : 그것에서 포함합니다.

Nokogiri::XML::XPath::SyntaxError: Undefined namespace prefix: //a:blip 

무엇 오전 : 당신이 그것을 볼 수 있듯이이 경우

내가 xml.xpath('//w:drawing')를 사용하여 <w:drawing> 태그에 액세스 할 수 있어요하지만 난 그렇게 xml.xpath('//w:drawing').xpath('//a:blip')을 수행 할 때, 그것은 오류가 발생 rId5

입니다 내가 잘못하고있다, 누군가가 올바른 방향으로 나를 가리킬 수 있습니까?

답변

1

오류가 //a:blip 당신의 XPath 쿼리에, 노코 기리은 '아무튼 당신을 말하고있다 네임 스페이스 a이 무엇을 의미하는지 알지 못합니다. 접두어가 아닌 쿼리에서 대상으로 지정할 네임 스페이스를 지정해야합니다. 접두어 a이 문서에 정의되어 있다는 사실은 실제로 중요하지 않습니다. 중요한 실제 네임 스페이스 URI입니다. 네임 스페이스 URI가 일치하는 한 쿼리에서 완전히 다른 접두사를 사용할 수 있습니다.

//w:drawing 쿼리가 작동하는 이유가 궁금 할 수 있습니다. 전체 XML을 포함 시키지는 않지만 w 접두어가 루트 노드에 정의되어 있다고 의심됩니다 (xmlns:w="http://some.uri.here"과 같은 것). 네임 스페이스를 지정하지 않으면 Nokogiri는 루트 노드에 정의 된 항목을 자동으로 등록하여 쿼리에서 사용할 수있게합니다. a 접두어에 해당하는 네임 스페이스는 루트에 정의되어 있지 않으므로 사용할 수 없으므로 표시되는 오류가 발생합니다.

당신이 xpath 방법 (또는 어떤 사용중인 적 쿼리 방법)에, 이름 공간 URI을합니다 ( 쿼리에 사용) 접두사를 매핑, 해시를 통과 노코 기리의 네임 스페이스를 지정합니다. 자신 만의 네임 스페이스 매핑을 제공하고 있기 때문에 루트 노드에서 사용하는 매핑도 포함해야합니다. Nokogiri는이 경우에는 포함하지 않습니다. 귀하의 경우에는

는 코드는 다음과 같을 것이다 :

namespaces = { 
    'w' => 'http://some.uri', # whatever the URI is for this namespace 
    'a' => 'http://schemas.openxmlformats.org/drawingml/2006/main' 
} 

# You can combine this to a single query. 
# Also note you don’t want a double slash infront of 
# the `/a:blip` part, just one. 
xml.xpath('//w:drawing/a:blip', namespaces) 

은 더 많은 정보를위한 Nokogiri tutorial section on namespaces에서보세요.

+0

나 같은 초보자를위한 훌륭한 설명, 고맙습니다. :) – adil

1

나는이 사용하는 XML 파서의 버그라고 말할 것이다 :

실제로 오류가 있지만, 그것은 <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">에 정의 된 네임 스페이스 접두사 a이 정의되지 않은 것 같다, 어떤 <a:blip> 요소의 부모입니다.

See here if you want to know more about xml namespaces

예를 들어, 그들은 노코 기리의 네임 스페이스 접두사와 문제에 대한 몇 가지 다른 질문을 것 같다 : Undefined namespace prefix in Nokogiri and XPath