首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用sax解析器修改xml字段值

如何使用sax解析器修改xml字段值
EN

Stack Overflow用户
提问于 2012-11-08 14:27:22
回答 3查看 3K关注 0票数 0

您好,我是Xml解析的新手

我想经常更改以下属性值.columnCount、宽度和高度

之后,我需要用修改过的数据重写xml文件

在使用java(sax,Dom或jaxB解析器)处理xml文件时,任何人都可以给出一些建议.............

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

代码语言:javascript
运行
复制
<?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>

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-08 14:34:11

如果您想修改文档,请使用DOM解析器。这将把xml文件转换成一个数据结构,您可以在其中找到属性并更改它们的值。看看jdom或dom4j,它们真的很容易使用。

如果您只想读取文档,那么sax解析器是一个很好的选择。该解析器只是在解析文档时创建事件。

回复您的评论:我没有得到NPE,但rootNode.getChild("detail"))返回null。这是因为元素与名称空间相关联。将示例代码中的最后一行替换为

代码语言:javascript
运行
复制
System.out.println(rootNode.getChild("detail", rootNode.getNamespace()));

这是可行的。

票数 1
EN

Stack Overflow用户

发布于 2012-11-08 14:50:29

web上有大量文档详细介绍了XML的编辑。探索它们,然后尝试一些东西。如果你被卡住了,那就把它贴在这里。

一些参考:http://www.w3schools.com/dom/default.asp

How to modify XML data in Dom parser

http://www.mkyong.com/java/how-to-modify-xml-file-in-java-dom-parser/

http://www.drdobbs.com/jvm/easy-dom-parsing-in-java/231002580

票数 0
EN

Stack Overflow用户

发布于 2013-06-13 17:29:56

也许您可以使用avc-binding-dom,它通过注释将DOM节点绑定到您的自定义Java接口:

代码语言:javascript
运行
复制
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.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13283683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档