java 解析XML,修改XML,求助。。。

moon_rainbows 2013-06-26 02:18:15
<param name="name1" value="value1"/>
<param name="name2" value="value2"/>
<param name="name3" value="value3"/>
<param name="name4" value="value4"/>
<param name="name5" value="value5"/>

我有一个XML格式是这样的,

怎么实现根据name修改value的值?

我试了下用Node,取不到name和value的值.......

...全文
184 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tony4geek 2013-06-30
  • 打赏
  • 举报
回复
或者用sax ,网上很多
oh_Maxy 版主 2013-06-29
  • 打赏
  • 举报
回复
引用 2 楼 qq366566477 的回复:
[quote=引用 1 楼 oh_Maxy 的回复:] 代码需要导入dom4j.jar

    public static void main(String[] args)
    {
        //修改条件和修改的值
        final String nameStr = "name2";
        final String valueStr = "value222";
        
        File xmlFile = new File("D:\\java\\test_java\\someXML.xml");
        SAXReader reader = new SAXReader();
        
        XMLWriter output = null;
        InputStream isr = null;
        
        try
        {
          //定义文件输入流
            isr = new FileInputStream(xmlFile);

            //以UTF-8的编码方式读取配置文件
            Document document = reader.read(new InputStreamReader(isr, "UTF-8"));
            //Document document = reader.read(xmlFile);
            Element root = document.getRootElement();
            List<?> nodes = root.elements("param");
            //遍历
            for (final Iterator<?> iterator = nodes.iterator(); iterator.hasNext();)
            {
                Element elm = (Element) iterator.next();
                String attName = elm.attribute("name").getValue();
                if(nameStr.equals(attName))
                {
                    elm.setAttributeValue("value", valueStr);
                }
            }
            OutputFormat format = new OutputFormat(null, false, "UTF-8");
            output = new XMLWriter(new FileOutputStream(xmlFile), format);
            output.write(document);
        }
        catch (DocumentException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (FileNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally
        {
          //关闭输入流
            if (null != isr)
            {
                try
                {
                    isr.close();
                }
                catch (Exception e)
                {
                    System.out.println(" close InputStream failure .\n" + e);
                }
            }

            //关闭写文件资源
            if (null != output)
            {
                try
                {
                    output.close();
                }
                catch (Exception e)
                {
                    System.out.println(" close XMLWriter failure .\n" + e);
                }
            }
        }
    }
someXML.xml文件放指定路径下,内容:

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<param name="name1" value="value1"/>
	<param name="name2" value="value2"/>
	<param name="name3" value="value3"/>
	<param name="name4" value="value4"/>
	<param name="name5" value="value5"/>
</root>
感谢你的方法。 我那问题描述的有点太简单了。。 需求是对XML进行查询和修改,就像map的键值对。 <name>name1</name> 比如这个格式的话,根据节点名直接取text就OK了,根据节点名直接修改text也OK。 不过<param name="name1" value="value1"/> 这种格式的节点名都是param, 要操作的是两个属性。。 想做的通用一点,不是直接写死的查name和value属性这种。。 不知道你明白我的意思没。。[/quote] 灵活是有个度的,对XML很灵活的话,比较复杂了。LZ除了这个简单例子,再举几个复杂的例子呗?
huntor 2013-06-28
  • 打赏
  • 举报
回复
可以使用xquery for java(XQJ)。ibm的developerworks上有这方面的资料
moon_rainbows 2013-06-28
  • 打赏
  • 举报
回复
引用 1 楼 oh_Maxy 的回复:
代码需要导入dom4j.jar

    public static void main(String[] args)
    {
        //修改条件和修改的值
        final String nameStr = "name2";
        final String valueStr = "value222";
        
        File xmlFile = new File("D:\\java\\test_java\\someXML.xml");
        SAXReader reader = new SAXReader();
        
        XMLWriter output = null;
        InputStream isr = null;
        
        try
        {
          //定义文件输入流
            isr = new FileInputStream(xmlFile);

            //以UTF-8的编码方式读取配置文件
            Document document = reader.read(new InputStreamReader(isr, "UTF-8"));
            //Document document = reader.read(xmlFile);
            Element root = document.getRootElement();
            List<?> nodes = root.elements("param");
            //遍历
            for (final Iterator<?> iterator = nodes.iterator(); iterator.hasNext();)
            {
                Element elm = (Element) iterator.next();
                String attName = elm.attribute("name").getValue();
                if(nameStr.equals(attName))
                {
                    elm.setAttributeValue("value", valueStr);
                }
            }
            OutputFormat format = new OutputFormat(null, false, "UTF-8");
            output = new XMLWriter(new FileOutputStream(xmlFile), format);
            output.write(document);
        }
        catch (DocumentException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (FileNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally
        {
          //关闭输入流
            if (null != isr)
            {
                try
                {
                    isr.close();
                }
                catch (Exception e)
                {
                    System.out.println(" close InputStream failure .\n" + e);
                }
            }

            //关闭写文件资源
            if (null != output)
            {
                try
                {
                    output.close();
                }
                catch (Exception e)
                {
                    System.out.println(" close XMLWriter failure .\n" + e);
                }
            }
        }
    }
someXML.xml文件放指定路径下,内容:

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<param name="name1" value="value1"/>
	<param name="name2" value="value2"/>
	<param name="name3" value="value3"/>
	<param name="name4" value="value4"/>
	<param name="name5" value="value5"/>
</root>
感谢你的方法。 我那问题描述的有点太简单了。。 需求是对XML进行查询和修改,就像map的键值对。 <name>name1</name> 比如这个格式的话,根据节点名直接取text就OK了,根据节点名直接修改text也OK。 不过<param name="name1" value="value1"/> 这种格式的节点名都是param, 要操作的是两个属性。。 想做的通用一点,不是直接写死的查name和value属性这种。。 不知道你明白我的意思没。。
oh_Maxy 版主 2013-06-26
  • 打赏
  • 举报
回复
代码需要导入dom4j.jar

    public static void main(String[] args)
    {
        //修改条件和修改的值
        final String nameStr = "name2";
        final String valueStr = "value222";
        
        File xmlFile = new File("D:\\java\\test_java\\someXML.xml");
        SAXReader reader = new SAXReader();
        
        XMLWriter output = null;
        InputStream isr = null;
        
        try
        {
          //定义文件输入流
            isr = new FileInputStream(xmlFile);

            //以UTF-8的编码方式读取配置文件
            Document document = reader.read(new InputStreamReader(isr, "UTF-8"));
            //Document document = reader.read(xmlFile);
            Element root = document.getRootElement();
            List<?> nodes = root.elements("param");
            //遍历
            for (final Iterator<?> iterator = nodes.iterator(); iterator.hasNext();)
            {
                Element elm = (Element) iterator.next();
                String attName = elm.attribute("name").getValue();
                if(nameStr.equals(attName))
                {
                    elm.setAttributeValue("value", valueStr);
                }
            }
            OutputFormat format = new OutputFormat(null, false, "UTF-8");
            output = new XMLWriter(new FileOutputStream(xmlFile), format);
            output.write(document);
        }
        catch (DocumentException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (FileNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally
        {
          //关闭输入流
            if (null != isr)
            {
                try
                {
                    isr.close();
                }
                catch (Exception e)
                {
                    System.out.println(" close InputStream failure .\n" + e);
                }
            }

            //关闭写文件资源
            if (null != output)
            {
                try
                {
                    output.close();
                }
                catch (Exception e)
                {
                    System.out.println(" close XMLWriter failure .\n" + e);
                }
            }
        }
    }
someXML.xml文件放指定路径下,内容:

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<param name="name1" value="value1"/>
	<param name="name2" value="value2"/>
	<param name="name3" value="value3"/>
	<param name="name4" value="value4"/>
	<param name="name5" value="value5"/>
</root>

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧