JAVA Dom4j解析XML文件异常,请高手帮忙

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA Dom4j解析XML文件异常,请高手帮忙相关的知识,希望对你有一定的参考价值。

<Offers xmlns="">
....
</Offers>
以上是一段xml结构字符串,当我用Dom4j解析它时,抛出如下异常:
Element or attribute do not match QName production: QName::=(NCName':')?NCName.
请高手帮忙看下是什么原因
<?xml version="1.0" encoding="UTF-8"?><Offers xmlns:=""><Offer></Offer></Offers>

这个是我通过他人提供的webservice获得的一段xml的字符串

参考技术A 错误原因是说元素或者属性不匹配。
<Offers xmlns:=""> 这个xmlns属性后便可以有冒号么?
在有你确认这个xml文档是正确的?也就是每组标签都是配对的?

你可以把xml文件发给我,这两天正好用dom4j做完一个庞大的xml解析工作。。。本回答被提问者和网友采纳
参考技术B xmlns:=""
不可以有冒号,或者你要在冒号后加上内容,xmlns:aa="...",如果加上的话解析的时候也要设置相应的名称空间,Node对象有个createXPath方法,他有设置名称空间的方法,selectNode可以执行xpath表达式,
我的建议是:
1、学学xml吧,也好知道xmlns是干吗用的
http://www.w3school.com.cn/xml/index.asp
2、学学xpath,对你解析xml和使用dom4j会有很大帮助
http://www.w3school.com.cn/xpath/index.asp
参考技术C 理解一下xmlns!
"xmlns"是Xhtml namespace的缩写!
是不是xml问题!
参考:http://blog.csdn.net/carefree31441/archive/2008/11/06/3235849.aspx

java解析XML修改特定项的值然后保存xml文件,求高手帮忙 急需 在线等

例如以下hibernate.cfg.xml文件,我要更改hibernate.connection.url,hibernate.connection.username,hibernate.connection.password的值:
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<property name="hibernate.connection.url">jdbc:sqlserver://192.168.1.52:1433;databaseName=Management</property>
<property name="hibernate.connection.username">parkdb</property>
<property name="hibernate.connection.password">123456789</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.max_size">50</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">50000</property>
<property name="hibernate.c3p0.max_statements">270</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">false</property>
<property name="hiberante.cache.use_second_level_cache">false</property>
<property name="hibernate.jdbc.batch_size">50</property>
<property name="hibernate.jdbc.fetch_size">100</property>
<mapping resource="model/InoutPut.hbm.xml"/>
<mapping resource="model/Uid.hbm.xml"/>
<mapping resource="model/Permission.hbm.xml"/>
<mapping resource="model/Staff.hbm.xml"/>
<mapping resource="model/Card.hbm.xml"/>
<mapping resource="model/Dept.hbm.xml"/>
<mapping resource="model/Userright.hbm.xml"/>
<mapping resource="model/Kqms.hbm.xml"/>
<mapping resource="model/SxTime.hbm.xml"/>
<mapping resource="model/Leave.hbm.xml"/>
</session-factory>
</hibernate-configuration>
急需 求给代码谢谢

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public static void main(String[] args) throws Exception
SAXReader sax = new SAXReader();
//假设你的xml是放在D盘下的叫做a.xml的文件
File file = new File("D:\\a.xml");
Document doc = sax.read(new FileInputStream(file));
Element root = doc.getRootElement();
root = root.element("session-factory");
List<Element> els = root.elements();
for(Element e : els)
if(e.getName().equals("property"))
String attval = e.attribute("name").getText();
if(attval.equals("hibernate.connection.url"))
//要修改的url的新值
e.setText("newUrl");
else if(attval.equals("hibernate.connection.username"))
/ /要修改的username的新值
e.setText("newUsername");
else if(attval.equals("hibernate.connection.password"))
//要修改的password的新值
e.setText("newPassword");



//重新写入到文件
XMLWriter output = new XMLWriter(new FileWriter(file));
output.write(doc);
output.close();


纯手打的,应该还有更简单的方法,但是没有工具忘记函数了,给你写了一个我记得住的方式,这个应该是可以的,用的是dom4j,如果你没有可能需要导入一个dom4j.jar的jar包
参考技术A 可以直接在HibernateSessionFactory中设置
configuration.configure(configFile);
configuration.setProperty("hibernate.connection.url",“你的url”);
configuration.setProperty("hibernate.connection.username",“”);
configuration.setProperty("hibernate.connection.password",“”);
sessionFactory = configuration.buildSessionFactory();
参考技术B 为什么不手动修改,必须要写程序吗?追问

上面要求jdbc:sqlserver://192.168.1.52:1433;databaseName=Management
parkdb
123456789
可以修改url的IP地址和数据库 ,username,password。我想了办法他们说不行让我用xml,而我不太懂xml所以只能求助了 如果你有好的介意还请指教

追答

我很奇怪,“他们说不行让我用xml”这就话是什么意思,既然数据库的URL可以修改了,为什么用户名和密码不能直接在XML修改,使用XML配置hibernate的数据源就是为了解决硬编码问题,XML既然在你手里,就可以有你来修改了,要用程序的话就使用DOM4j这个开源库了,他的API很简单的,我觉得这样是不是有点费力不讨好啊

追问

我写的是javaswing项目 里面有一个配置面板 要求是配置好后以后都用其上面的配置 就算是关闭了该项目 数据连接那些都不能发生改变 除非用户在配置面板中去重新配置

追答

你早说啊,我去,我还你为你写的是JavaWeb项目,等等我帮你写一个

追问

好的 谢谢了

追答

public class XMLUtil

//先读取指定的XML文件,url是文件的路径
public Document read(String url)
SAXReader reader = new SAXReader();
Document document=null;
try
document = reader.read(url);
catch (DocumentException e)
e.printStackTrace();

return document;

//设置你要改变的XML节点值url就是hibernate.connection.url的值,其他的不解释了,你知道的
public Document change(String url,String username,String password,Document document)
Element root = document.getRootElement();
Element element2 = root.element("session-factory");
for ( Iterator i = element2.elementIterator("property"); i.hasNext(); )
Element element = (Element) i.next();
Attribute attribute = element.attribute("name");
String attrValue = attribute.getValue();
if(attrValue.equals("hibernate.connection.url"))
element.setText(url);

else if(attrValue.equals("hibernate.connection.username"))
element.setText(username);

else if(attrValue.equals("hibernate.connection.password"))
element.setText(password);


return document;

//输出xml,url输出路径
public void write(String url,Document document)
OutputFormat format = OutputFormat.createPrettyPrint();
try
FileWriter fileWriter = new FileWriter(url);
XMLWriter writer = new XMLWriter(fileWriter,format);
writer.write(document);
writer.close();
catch (IOException e)
e.printStackTrace();


public static void main(String[] args)
XMLUtil xmlUtil=new XMLUtil();
Document document = xmlUtil.read("hibernate.cfg.xml");
document=xmlUtil.change("www", "datouxiangzi", "123456", document);
xmlUtil.write("hibernate.cfg.xml", document);

追问

我用了 可是报错耶
org.dom4j.DocumentException: Connection timed out: connect Nested exception: Connection timed out: connect
at org.dom4j.io.SAXReader.read(SAXReader.java:484)
at org.dom4j.io.SAXReader.read(SAXReader.java:321)
at XMLUtil.read(XMLUtil.java:30)
at XMLUtil.main(XMLUtil.java:70)
Nested exception:

参考技术C 使用dom4j或者是j4dom对血没了进行操作,具体可以看着两者的文档追问

我对xml不熟 可以麻烦给代码 我现在急需 谢谢

以上是关于JAVA Dom4j解析XML文件异常,请高手帮忙的主要内容,如果未能解决你的问题,请参考以下文章

java中DOM解析XML文件 请高手帮助

我用dom4j创建了一个xml文档,没有错误,但运行没有结果,哪位高手指点一下

Java案例:利用dom4j解析XML文件

Java里面怎么解析xml文件的内容

java中采用dom4j解析xml文件

Illegal reflective access by org.dom4j.io.SAXContentHandler ,使用Dom4j解析xml出现非法反射异常,