2015-02-18 2 views
0

Это типичная структура <w:r>, которая содержит форму (формы).Извлечение данных внутри <mc: Выбор Требуется = "wps"> (docx4j)

<w:r w:rsidR="00D10BFA"> 
<w:rPr> 
    <w:noProof/> 
    <w:lang w:eastAsia="en-PH" /> 
</w:rPr> 
<mc:AlternateContent> 
    <mc:Choice Requires="wps"> 
     <w:drawing> 
      <wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0" relativeHeight="251660288" behindDoc="0" locked="0" layoutInCell="1" allowOverlap="1"> 
       <wp:simplePos x="0" y="0" /> 
       <wp:positionH relativeFrom="column"> 
        <wp:posOffset>2171700</wp:posOffset> 
       </wp:positionH> 
       <wp:positionV relativeFrom="paragraph"> 
        <wp:posOffset>99203</wp:posOffset> 
       </wp:positionV> 
       <wp:extent cx="1943100" cy="1714500" /> 
       <wp:effectExtent l="19050" t="19050" r="19050" b="19050" /> 
       <wp:wrapNone/> 
       <wp:docPr id="2" name="Oval 2" /> 
       <wp:cNvGraphicFramePr/> 
       <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"> 
        <a:graphicData uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"> 
         <wps:wsp> 
          <wps:cNvSpPr/> 
          <wps:spPr> 
           <a:xfrm> 
            <a:off x="0" y="0" /> 
            <a:ext cx="1943100" cy="1714500" /> 
           </a:xfrm> 
           <a:prstGeom prst="ellipse"> 
            <a:avLst/> 
           </a:prstGeom> 
           <a:solidFill> 
            <a:schemeClr val="accent4"> 
             <a:lumMod val="75000" /> 
            </a:schemeClr> 
           </a:solidFill> 
           <a:ln w="28575" cap="sq"> 
            <a:solidFill> 
             <a:schemeClr val="accent6"> 
              <a:lumMod val="75000" /> 
             </a:schemeClr> 
            </a:solidFill> 
           </a:ln> 
          </wps:spPr> 
          <wps:style> 
           <a:lnRef idx="2"> 
            <a:schemeClr val="accent1"> 
             <a:shade val="50000" /> 
            </a:schemeClr> 
           </a:lnRef> 
           <a:fillRef idx="1"> 
            <a:schemeClr val="accent1" /> 
           </a:fillRef> 
           <a:effectRef idx="0"> 
            <a:schemeClr val="accent1" /> 
           </a:effectRef> 
           <a:fontRef idx="minor"> 
            <a:schemeClr val="lt1" /> 
           </a:fontRef> 
          </wps:style> 
          <wps:txbx> 
           <w:txbxContent> 
            <w:p w:rsidR="00D10BFA" w:rsidRDefault="00D10BFA" w:rsidP="00D10BFA"> 
             <w:pPr> 
              <w:jc w:val="center" /> 
             </w:pPr> 
             <w:r> 
              <w:t>THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG.THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG.THEQUICKBROWFA</w:t> 
             </w:r> 
            </w:p> 
           </w:txbxContent> 
          </wps:txbx> 
          <wps:bodyPr rot="0" spcFirstLastPara="0" vertOverflow="overflow" horzOverflow="overflow" vert="horz" wrap="square" lIns="91440" tIns="45720" rIns="91440" bIns="45720" numCol="1" spcCol="0" rtlCol="0" fromWordArt="0" anchor="ctr" anchorCtr="0" forceAA="0" compatLnSpc="1"> 
           <a:prstTxWarp prst="textNoShape"> 
            <a:avLst/> 
           </a:prstTxWarp> 
           <a:noAutofit/> 
          </wps:bodyPr> 
         </wps:wsp> 
        </a:graphicData> 
       </a:graphic> 
      </wp:anchor> 
     </w:drawing> 
    </mc:Choice> 
    <mc:Fallback> 
     <w:pict> 
      <v:oval id="Oval 2" o:spid="_x0000_s1028" style="position:absolute;margin-left:171pt;margin-top:7.8pt;width:153pt;height:135pt;z-index:251660288;visibility:visible;mso-wrap-style:square;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;mso-position-horizontal:absolute;mso-position-horizontal-relative:text;mso-position-vertical:absolute;mso-position-vertical-relative:text;v-text-anchor:middle" o:gfxdata="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&#xA;AAAA&#xA;" fillcolor="#bf8f00 [2407]" strokecolor="#538135 [2409]" strokeweight="2.25pt"> 
       <v:stroke joinstyle="miter" endcap="square" /> 
       <v:textbox> 
        <w:txbxContent> 
         <w:p w:rsidR="00D10BFA" w:rsidRDefault="00D10BFA" w:rsidP="00D10BFA"> 
          <w:pPr> 
           <w:jc w:val="center" /> 
          </w:pPr> 
          <w:r> 
           <w:t>THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG.THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG.THEQUICKBROWFA</w:t> 
          </w:r> 
         </w:p> 
        </w:txbxContent> 
       </v:textbox> 
      </v:oval> 
     </w:pict> 
    </mc:Fallback> 
</mc:AlternateContent> 

Он содержит rPr и mc:AlternateContent. Моя проблема заключается в том, что когда я пытаюсь сделать r.getContent(), вы ожидаете иметь два элемента: rPr и mc:AlternateContent. Но в фактическом результате у вас будет только pict, так как поведение выглядит следующим образом: r.getContent() извлекает только элементы внутри тега <mc:Fallback>.

Что я хочу иметь, я хочу получить <a:graphic>, который определенно находится внутри <mc:Choice>.<w:drawing>.<wp:anchor>.

ответ

1

В общем случае наличие элемента mc вызывает исключение UnmarshalException, поскольку оно является недопустимым содержимым в соответствии со схемами, используемыми в docx4j.

Когда это происходит, docx4j предварительно обрабатывает контент через org/docx4j/jaxb/mc-preprocessor.xslt, который обычно выбирает содержимое mc: Fallback.

У вас есть различные варианты, чтобы переопределить это поведение:

  • легко: вы можете поставить свой собственный XSLT, который делает что-то другое; см свойство «docx4j.jaxb.JaxbValidationEventHandler», чтобы указать его местоположение
  • более сложным и полностью поддерживается: изменить XSDs, чтобы содержание тс пространства имен в элементе интереса, а затем регенерировать соответствующие классы с использованием XSD
  • изменить jaxb, чтобы справиться с тем, как работает механизм совместимости разметки. Это было бы очень круто!

Для получения дополнительной информации о совместимости и расширяемости разметки в Google «openxml» или попробуйте это TC45 final draft.

+0

Спасибо за ответ молниеносно. Можно ли просто добавить LOC (ы), чтобы получить ** mc: Choice **? Потому что, если я хочу вернуться к извлечению ** mc: Fallback ** снова? или что, если я хочу получить оба ** mc: Choice ** и ** mc: Fallback **? – sorryiamnaive

+0

Ну, вы можете выразить логику в XSLT. Но подход XSLT должен только когда-либо давать вам содержимое одного из элементов выбора или возврата. Если вы хотите иметь доступ к элементам mc: AlternateContent и его содержимому, добавьте @XmlElementRef для org.docx4j.mce.AlternateContent в поле списка. . Вам также нужно добавить «org.docx4j.mce» в Context.jc. После этого у вас будет то, что вы спросите, но я ожидаю, что содержимое этих элементов будет возвращено как XML (что вы, конечно, можете развязать) – JasonPlutext