2012-11-08 96 views
0

您好,我是很新的XML解析我如何通過SAX解析器修改XML字段值

我想改變下列屬性值頻繁........... 信息columnCount,寬度和高度

之後,我需要通過使用Java下面的XML文件重寫XML文件修改後的數據

(SAX,DOM或JAXB解析器)請任何一個可以給它的一些建議....... ........

====================================== ===== ================================================================

<?xml version="1.0" encoding="UTF-8"?> 
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Hello_subreport1_subreport1" language="groovy" columnCount="2" printOrder="Horizontal" pageWidth="520" pageHeight="802" columnWidth="260" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="ac19d62f-eac8-428e-8e0a-9011534189ed"> 
    <property name="ireport.zoom" value="1.0"/> 
    <property name="ireport.x" value="0"/> 
    <property name="ireport.y" value="0"/> 
    <queryString> 
     <![CDATA[]]> 
    </queryString> 
    <field name="subjectName" class="java.lang.String"> 
     <fieldDescription><![CDATA[subjectName]]></fieldDescription> 
    </field> 
    <field name="subjectID" class="java.lang.Integer"> 
     <fieldDescription><![CDATA[subjectID]]></fieldDescription> 
    </field> 
    <field name="maxMarks" class="java.lang.Integer"> 
     <fieldDescription><![CDATA[maxMarks]]></fieldDescription> 
    </field> 
    <field name="redMarks" class="java.lang.Float"> 
     <fieldDescription><![CDATA[redMarks]]></fieldDescription> 
    </field> 
    <field name="passMarks" class="java.lang.Integer"> 
     <fieldDescription><![CDATA[passMarks]]></fieldDescription> 
    </field> 
    <field name="marks" class="java.lang.Float"> 
     <fieldDescription><![CDATA[marks]]></fieldDescription> 
    </field> 
    <background> 
     <band splitType="Stretch"/> 
    </background> 
    <detail> 
     <band height="52"> 
      <textField isStretchWithOverflow="true"> 
       <reportElement uuid="5f7665fb-9218-4434-a9e5-5eff306499b3" x="0" y="33" width="100" height="20"/> 
       <box> 
        <pen lineWidth="0.0"/> 
        <topPen lineWidth="0.0"/> 
        <leftPen lineWidth="0.0"/> 
        <bottomPen lineWidth="0.0"/> 
        <rightPen lineWidth="0.0"/> 
       </box> 
       <textElement> 
        <font size="12"/> 
       </textElement> 
       <textFieldExpression><![CDATA[$F{marks}]]></textFieldExpression> 
      </textField> 
      <textField> 
       <reportElement uuid="6b999cb1-600e-4634-be8f-7ac99e225f49" x="0" y="13" width="100" height="20"/> 
       <box> 
        <topPen lineWidth="0.25"/> 
       </box> 
       <textElement/> 
       <textFieldExpression><![CDATA[$F{subjectName}]]></textFieldExpression> 
      </textField> 
     </band> 
    </detail> 
</jasperReport> 

================================================= =======================

+0

JAXB是正確的選擇工作@venkat – gks

回答

0

如果您想修改文檔,請使用DOM解析器。這會將xml文件轉換爲數據結構,您可以在其中找到屬性並更改其值。看看jdom或dom4j,它們非常易於使用。

如果您只想閱讀文檔,薩克斯解析器是一個不錯的選擇。解析器只是在解析文檔時創建事件。


回答您的意見:我沒有得到NPE,但rootNode.getChild("detail"))返回null。這是因爲該元素與名稱空間相關聯。用您的示例代碼中的最後一行替換爲

System.out.println(rootNode.getChild("detail", rootNode.getNamespace())); 

這很有效。

+0

我得到空指針異常請爲 – venkat

+1

(你在開玩笑嗎?)提供一些解決方案,不要指望如果你不顯示任何代碼得到NPE的解決方案: -D –

+0

對不起安德烈亞斯,實際上我能夠得到rootNode,我能夠改變rootNode的屬性,但我無法得到子節點,它給予空指針異常..............請注意下面一塊代碼 – venkat

0

也許你可以使用avc-binding-dom,結合DOM通過註釋節點以自定義的Java接口:

import org.w3c.dom.Node; 
import net.avcompris.binding.annotation.XPath; 
import net.avcompris.binding.dom.impl.DefaultDomBinder; 

@Namespaces("xmlns:jr=http://jasperreports.sourceforge.net/jasperreports") 
@XPath("/jr:jasperReport") 
interface MyJasperReport { 

    @XPath("@columnCount") 
    int getColumnCount(); 
    void setColumnCount(int columnCount); 

    @XPath("@pageWidth") 
    int getPageWidth(); 
    void setPageWidth(int pageWidth); 

    @XPath("jr:property[@name = 'ireport.zoom']/@value") 
    String getZoom(); 
    void setZoom(String zoom); 
} 

Node node = ... // You have to load the XML file into a DOM node. 

MyJasperReport jr = new DefaultDomBinder().bind(node, MyJasperReport.class); 

jr.setColumnCount(4); // previously: 2 
jr.setPageWidth(1024); // previously: 520 
jr.setZoom("1.45"); // previously: "1.0" 

... // then save the DOM node into a XML file.