你的数据库是什么数据库:我用的是SQLserver用它的存储过程:然后你用程序调用存储过程,把 xml文件传进去就行了。
CREATE proc usp_InsertXmlToTable
@xmldoc ntext
asset nocount on
Declare @hdoc intbegin
exec sp_xml_preparedocument @hdoc output,@xmldoc
--更新tb_sys_clan表
insert into tb_sys_clan
SELECT *
FROM OPENXML (@hdoc, '/tables/table/row[../@tableName="tb_sys_clan"]',1)
WITH ( Id int './Id/text()',
ClanName varchar(50) './ClanName/text()'
)exec sp_xml_removedocument @hdoc
end
GO
CREATE proc usp_InsertXmlToTable
@xmldoc ntext
asset nocount on
Declare @hdoc intbegin
exec sp_xml_preparedocument @hdoc output,@xmldoc
--更新tb_sys_clan表
insert into tb_sys_clan
SELECT *
FROM OPENXML (@hdoc, '/tables/table/row[../@tableName="tb_sys_clan"]',1)
WITH ( Id int './Id/text()',
ClanName varchar(50) './ClanName/text()'
)exec sp_xml_removedocument @hdoc
end
GO
看看你用的数据库是不是技持 XML 和存储过程。
多谢帮助!
请问:“在解释XML中用到了xpath进行定位和过滤。”内容能否详细些(我太笨了)
用什么方法解释XML文件呢?
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("d:/test.xml"));
Element rootElement = document.getDocumentElement();
NodeList list = rootElement.getElementsByTagName("theElementNameWhichYouWantToUse");
for (int i = 0; i < list.getLength(); i++) {
Element element = (Element)list.item(i);
NodeList yearList = element.getElementsByTagName("theSubElementName");
for (int j = 0; j < yearList.getLength(); j++) {
Text text = (Text)yearList.item(j).getFirstChild();
System.out.println(text.getData());//输出到控制台,楼主可以进行相应的存储
}
}//这是我借用 DreamDragon_NEU(梦龙) 回复别人一个问题时候用到的,你自己看看,可以改了吧?
2、现在很多数据库还不支持XML如果你要通用的那只能通过XPATH定位,然后把XML中的数据取出来,一条一条的写了。
3、一个把XML文件转成String并保存成文件的例字。我以前做的时候是从数据库---XML----数据库package com.netec.congress.business.conversion;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import com.netec.congress.business.xml.DataToXML;
public class DataImportOutput {
private static Document doc = null;
public DataImportOutput(Document document){
DataImportOutput.doc=document;
}
private String otputDOMToXMLString(Document doc) throws IOException {
String XMLString = "";
//建立dom的输出格式
OutputFormat format = new OutputFormat(doc);
StringWriter stringOut = new StringWriter();
XMLSerializer serial = new XMLSerializer(stringOut, format);
serial.asDOMSerializer();
serial.serialize(doc.getDocumentElement());
XMLString = stringOut.toString();
System.out.println(XMLString);
return XMLString;
}
private void saveXMLString(String XMLString, String fileName)
throws IOException {
File file = new File(fileName);
if (file.exists()) {
file.delete();
}
file.createNewFile();
if (file.canWrite()) {
FileWriter fileOut = new FileWriter(file);
fileOut.write(XMLString);
fileOut.close();
}
} public void saveDOMToXML(String filePath, Document doc) throws IOException {
String XMLString = null;
XMLString = this.otputDOMToXMLString(doc); //把document转为字符串型
this.saveXMLString(XMLString, filePath); //保存为xml格式
}
public Element getTableDOM(String tableName, List rowsList) {
Element columNameElement=null;
Text columTextNode=null;
String columName = "";
String columValue = "";
Set set=null;
HashMap map=null;
DataToXML dataToXML=null;
Element row=null;
Iterator iterator=null;
Iterator rowIterator = rowsList.iterator();
Element table = doc.createElement("table"); //创建table结点
Attr attr = doc.createAttribute("tableName"); //创建table结点的属性结点tableName
attr.setValue(tableName); //设置属性结点的属性值为传入参数tableName
table.setAttributeNode(attr); //把属性结点添加到table结点上
while (rowIterator.hasNext()) {
row = doc.createElement("row");
dataToXML = (DataToXML) rowIterator.next();
map = dataToXML.getMap();//map中保存着表的所有字段名,及字段对应的值
set = map.keySet();
iterator = set.iterator();
while (iterator.hasNext()) {
columName = (String) iterator.next();
columValue = (String) map.get(columName);
columNameElement = doc.createElement(columName);
columTextNode = doc.createTextNode(columValue);
columNameElement.appendChild(columTextNode);
row.appendChild(columNameElement);
}
table.appendChild(row);
}
return table;
}
}
可是由于我所操作的XML文件有很多(很多不同名称的XML文件并且每个xml文件数据量很大),如果按节点逐一添加,性能会受到很大影响.请问用什么方法可以一个XML文件一次更新到表中呢?
this.saveXMLString(XMLString, filePath); //保存为xml格式那两个方法可以转成String并保存XML。转成String后把值传给那个存储过程。就行了。
调用方法:otputDOMToXMLString 生成字符串是什么格式呢?生成后怎么更新到数据库中?