2016-02-23 53 views
1

我想解析由Google文檔生成的docx文件。我正在查看一個名爲run的XWPFRun元素。如果我調用run.isBold(),它將返回false,即使元素是粗體。如果我看一下run.getCTR(),我得到下面的xml。正如你可以看到它說在文檔文件中使用1而不是true是否有效?

<w:b w:val="1"/> 

,而不是

<w:b w:val="true"/> 

,這將導致isBold()返回false(我猜)。如果我在LibreOffice中導入文件,並再次導出isBold()返回true,那麼這是Google文檔導出中的錯誤還是poi?或者我做錯了什麼?

<xml-fragment w:rsidDel="00000000" w:rsidR="00000000" w:rsidRPr="00000000" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:lc="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas" xmlns:dgm="http://schemas.openxmlformats.org/drawingml/2006/diagram" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"> 
    <w:rPr> 
    <w:rFonts w:ascii="Verdana" w:cs="Verdana" w:eastAsia="Verdana" w:hAnsi="Verdana"/> 
    <w:b w:val="1"/> 
    <w:sz w:val="36"/> 
    <w:szCs w:val="36"/> 
    <w:rtl w:val="0"/> 
    </w:rPr> 
    <w:t xml:space="preserve">Kapitel 1: Digitale tømmermænd</w:t> 
    <w:br w:type="textWrapping"/> 
</xml-fragment> 
+0

您可以在相應架構(自帶POI)或標準(ECMA 376/ISO 29500 - Google是您的朋友)中查找可接受的值, – morido

回答

1

從wml.xsd POI OOXML-LIB/OpenOfficeXML-XMLSchemas.zip,我可以得出結論,1 |真|上都是可以接受的,相當於真值,而0 |虛假|關閉都是可以接受的,等價的假值。任何應用程序都應該能夠將這6個值中的任何一個寫入XML文件,任何應用程序都應該能夠以100%的可懂度讀取這6個值中的任何一個。

您已發現POI中的錯誤。查看isBold的implementation(並且isItalic和其他使用isCTOnOff的代碼),代碼忽略了您發現的「1」/「0」的情況。該代碼還應該使用STOnOff.X_1。

這是現在的fixed on POI trunk,將在下一個POI版本(3.15測試版1)中提供。

<xsd:element name="b" type="CT_OnOff" minOccurs="0"> 
    <xsd:annotation> 
    <xsd:documentation>Bold</xsd:documentation> 
    </xsd:annotation> 
</xsd:element> 

<xsd:complexType name="CT_OnOff"> 
    <xsd:attribute name="val" type="ST_OnOff"> 
    <xsd:annotation> 
     <xsd:documentation>On/Off Value</xsd:documentation> 
    </xsd:annotation> 
    </xsd:attribute> 
</xsd:complexType> 

<xsd:simpleType name="ST_OnOff"> 
    <xsd:annotation> 
    <xsd:documentation>On/Off Value</xsd:documentation> 
    </xsd:annotation> 
    <xsd:restriction base="xsd:string"> 
    <xsd:enumeration value="true"> 
     <xsd:annotation> 
     <xsd:documentation>True</xsd:documentation> 
     </xsd:annotation> 
    </xsd:enumeration> 
    <xsd:enumeration value="false"> 
     <xsd:annotation> 
     <xsd:documentation>False</xsd:documentation> 
     </xsd:annotation> 
    </xsd:enumeration> 
    <xsd:enumeration value="on"> 
     <xsd:annotation> 
     <xsd:documentation>True</xsd:documentation> 
     </xsd:annotation> 
    </xsd:enumeration> 
    <xsd:enumeration value="off"> 
     <xsd:annotation> 
     <xsd:documentation>False</xsd:documentation> 
     </xsd:annotation> 
    </xsd:enumeration> 
    <xsd:enumeration value="0"> 
     <xsd:annotation> 
     <xsd:documentation>False</xsd:documentation> 
     </xsd:annotation> 
    </xsd:enumeration> 
    <xsd:enumeration value="1"> 
     <xsd:annotation> 
     <xsd:documentation>True</xsd:documentation> 
     </xsd:annotation> 
    </xsd:enumeration> 
    </xsd:restriction> 
</xsd:simpleType> 
相關問題