Java 如何通过sax解析器修改xml字段值
嗨,我对Xml解析非常陌生 我想经常更改以下属性值。。。。。。。。。。。 列数、宽度和高度 之后,我需要用修改过的数据重写xml文件 在下面使用java(sax、Dom或jaxB解析器)编写的xml文件中,任何人都可以给出一些建议 =======================================================================================Java 如何通过sax解析器修改xml字段值,java,xml,jaxb,saxparser,Java,Xml,Jaxb,Saxparser,嗨,我对Xml解析非常陌生 我想经常更改以下属性值。。。。。。。。。。。 列数、宽度和高度 之后,我需要用修改过的数据重写xml文件 在下面使用java(sax、Dom或jaxB解析器)编写的xml文件中,任何人都可以给出一些建议 ======================================================================================= <?xml version="1.0" encoding="UTF-8"?> &
<?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>
===============================================================================如果要修改文档,请使用DOM解析器。这将把xml文件转换成一个数据结构,您可以在其中找到属性并更改它们的值。看看jdom或dom4j,它们真的很容易使用
<?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>
如果您只想阅读文档,那么sax解析器是一个不错的选择。该解析器只是在解析文档时创建事件
回答您的评论:我没有得到NPE,但是
rootNode.getChild(“detail”)
返回null。这是因为元素与名称空间相关联。将示例代码中的最后一行替换为
System.out.println(rootNode.getChild("detail", rootNode.getNamespace()));
这很有效。web上有大量文档详细介绍了XML的编辑。探索它们,然后尝试一些东西。如果你被卡住了,就把它贴在这里 一些参考: 也许您可以使用,它通过注释将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.
JAXB是正确的工作选择@venkati正在获取nullpointer异常请为此提供一些解决方案(你在开玩笑吗?)说真的,如果你没有显示任何代码,不要期望获得NPE的解决方案:-Dsorry Andreas,实际上我能够获取rootNode,并且我能够更改rootNode的属性,但我无法获取子节点,它给出了空指针异常………..请注意下面的一段代码公共类ModifyXMLFile{public static void main(String[]args){try{SAXBuilder builder=new SAXBuilder();System.out.println(builder+“builder”);File xmlFile=new File(“sample.xml”);Document doc=(Document)builder.build(xmlFile);System.out.println(doc+“builder”);Element rootNode=doc.getRootElement();rootNode.getAttribute(“columnCount”).setValue(“100”);System.out.println(rootNode+“rootNode”);System.out.println(rootNode.getChild(“detail”);------------->我在这里得到的正是NPE