第一种:使用XPath
XML的路径我配置在webconfig
的appSettings节点下
Hashtable ht = new Hashtable();
string orgCodePath = ServerMapPath(ConfigurationSettingsAppSettings["orgCodePath"]);
//string orgCodePath = ServerMapPath("//template/home/orgCodexml");
XmlDocument xmldoc = new XmlDocument();
xmldocLoad(orgCodePath);
//获取节点列表
XmlNodeList topM = xmldocSelectNodes("//Organization");
foreach (XmlElement element in topM)
{
string id = elementGetElementsByTagName("ID")[0]InnerText;
string domainName = elementGetElementsByTagName("DomainName")[0]InnerText;
htAdd(id, domainName);
}
第二种:遍历式读取XML
//打开某文件(假设webconfig在根目录中)
string filename=ServerMapPath("/") + @"WebApplication1/webconfig";
XmlDocument xmldoc= new XmlDocument();
xmldocLoad(filename);
//得到顶层节点列表
XmlNodeList topM=xmldocDocumentElementChildNodes;
foreach(XmlElement element in topM)
{
if(elementNameToLower()=="appsettings")
{
//得到该节点的子节点
XmlNodeList nodelist=elementChildNodes;
if ( nodelistCount >0 )
{
//DropDownList1ItemsClear();
foreach(XmlElement el in nodelist)//读元素值
{
//DropDownList1ItemsAdd(elAttributes["key"]InnerXml);
//thisTextBox2Text=elAttributes["key"]InnerText;
thisTextBox2Text=elAttributes["key"]Value;
thisLabel1Text=elAttributes["value"]Value;
//同样在这里可以修改元素值,在后面save。
// elAttributes["value"]Value=thisTextBox2Text;
}
}
}
}
xmldocSave(filename);
读取xml任意节点
XmlNode node=docSelectSingleNode("/configuration/appSettings/add"); //按照节点目录查询
if(node!=null)
{
string k=nodeAttributes["key"]Value;
string v=nodeAttributes["value"]Value;
node=null;
}
XmlNode node=docSelectSingleNode("/configuration/appSettings/add");
if(node!=null)
{
XmlNodeReader nr=new XmlNodeReader(node);
nrMoveToContent();
//检查当前节点是否是内容节点。如果此节点不是内容节点,则读取器向前跳至下一个内容节点或文件结尾。
nrMoveToAttribute("value");
string s=nrValue;
node=null;
}
空指针的位置实在getPath方法,因为getResource方法返回了Null,导致nullgetPath就是空指针了,问题出在你没有获取到notexml文件,所以你需要解决这个问题,你把代码拆开写就知道了,getResource 用个变量接受,然后你看它 是不是 null
XML基础说明2008-05-23 15:45XML标签说明: 其中带星号标记的为必选项,未带星号标记为可选项。
<document>——标记整个XML文件内容的开始和结束。
<webSite>——站点地址。
<webMaster>——负责人员的Email。当有必要时,我们通过这个地址与您联系。
<updatePeri>——更新周期,以分钟为单位。搜索引擎将遵照此周期访问该页面,使页面上的新闻更及时地出现在百度新闻中。
<item>——标记每篇新闻信息的开始和结束。标记内为单篇新闻信息,不包括新闻专题。
<title>——新闻标题。
<link>——新闻url地址,与单篇新闻一一对应;若分页的新闻存在多个URL,标题相同则属于同一篇新闻,请提供一个URL。
<description>——新闻内容简介。
<text>——完整的新闻正文(仅包含正文文字,不包含HTML语言等其它字符)。此项的目的是使该篇新闻更多、更准地出现在搜索结果中。
<image>——新闻正文内相关,采用绝对地址。若该篇新闻无相关,可以为空;若含有多张,请重复使用该标签。此项的目的是使该篇新闻的相关展现在搜索结果中。
<headlineImg>——为有可能成为头条的新闻制作的头条图,采用绝对地址。
<keywords>——反映新闻主题内容的一个或多个关键词,关键词之间以空格隔开。此项仅作为参考,检索结果不完全依赖于此标签中的内容。
<category>——新闻分类, 可以遵循网站自身的分类体系,最好采用一级分类。
<author>——新闻作者,可以为机构或个人 。
<source>——新闻来源,即原创媒体或其它机构 。
<pubDate>——新闻发布时间,与该篇新闻HTML页面上的发布时间保持一致。请精确到分钟;若您网站的发布时间未记录小时分钟,提供年月日即可。
推荐时间格式:年月日小时分钟秒
如:2005-11-09 10:37 | 2005/11/09 10:37:00 | 20051109 10:37:00 |
2005年11月09日10时37分00秒 | Fri, 09 Nov 2005 10:37:00 GMT
返回页首
下面就开始吧!
第一步:创建XML文件
请您在创建XML文件新闻内容前务必阅读下面百度新闻搜索的收录标准:
1、 百度新闻搜索收录的内容包括:时政、娱乐、体育、财经、科教文化、社会生活等各类新闻报道及媒体评论,数码产品、房产、汽车等行情资讯及评测,各行业的动态及行情,组织机构的工作动态等,是由专业人士撰写或编辑的中文信息。
2、 百度新闻搜索收录的内容不包括:个人信息、论坛、博客、广告、幽默笑话、情感故事、情色、写真、剧照、明星档案、食谱、下载、多媒体等其它类型、其它语言互联网信息。
3、百度新闻搜索希望收录高质量的中文新闻,不收录英文等其它非中文新闻。
4、请按照上面公布的开放协议内容制作XML文件。
其他说明:
支持的编码格式有GB2312、GB18030、UTF-8、BIG5,推荐使用GB18030或UTF-8格式。
您可以将网站某一时间段发布的全部新闻放在一个XML文件中,也可以分频道或栏目放在多个XML文件中。
请保持每个XML文件处于按更新周期持续自动更新状态。更新周期可根据您的需要随时进行调整。
每个XML文件至多存放最新发布的100条新闻,无需保存之前的新闻。
请将发布的新闻按照时间排序,即最新发布的新闻在最上端,否则可能有新闻被遗漏。
XML标签内容中,除文字文本以外不能包含其它任何代码,下表中的特殊字符必须转换为XML定义的转义字符。否则将发生错误导致搜索引擎不能获取页面上的新闻。 字符 转义后的字符
HTML字符 字符编码
和(and) & & &
单引号 ' ' '
双引号 " " "
大于号 > > >
小于号 < < <
转义字符中的"&"无需再转。
建议您使用CDATA 部件。一个 CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束。将包含代码或特殊字符的文本置于CDATA 部件内 ,就无需再对特殊字符进行转义。
第二步:验证XML文件
下面的地址提供了帮助您验证XML文件结构的多种工具:
>
一、环境:
主机:WIN8
开发环境:Eclipse
二、说明:
1打开sd卡中的xml文件,如果不存在,这新建一个,并写入默认配置
2读取xml文件
三、xml文件格式:
<xml version="10" encoding="UTF-8" standalone="true">
-<config>
<title>远程视频会见系统</title>
<local_port>12600</local_port>
<schedule_service_ip>1058159</schedule_service_ip>
<schedule_service_port>12601</schedule_service_port>
</config>
四、源代码:
package comexamplehelloanychat;
import javaioFile;
import javaioFileInputStream;
import javaioFileOutputStream;
import javaioIOException;
import javaioStringWriter;
import javanetInet6Address;
import javanetInetAddress;
import javanetNetworkInterface;
import javanetSocketException;
import javautilEnumeration;
import javaxxmlparsersDocumentBuilder;
import javaxxmlparsersDocumentBuilderFactory;
import androidosEnvironment;
import androidutilLog;
import orgw3cdomDocument;
import orgw3cdomElement;
import orgw3cdomNodeList;
import orgxmlpullv1XmlPullParserFactory;
import orgxmlpullv1XmlSerializer;
/
配置信息类
新建日期:2014/12/8 by jdh
/
public class Config implements IF_Config {
//配置信息
private Config_Info config_info = new Config_Info();
/
构造函数
/
public Config() {
boolean ok;
File sd_path;
File file_cfg_dir;
File file_cfg;
FileOutputStream out;
String str;
FileInputStream in;
//得到本机ip地址
config_infolocal_ip = getLocalIpAddress();
Systemoutprintf("本机ip:%s\n", config_infolocal_ip);
//获取SD卡目录
sd_path = EnvironmentgetExternalStorageDirectory();
//判断文件夹是否存在
file_cfg_dir = new File(sd_pathgetPath() + "//Remote_Meeting");
if (!file_cfg_direxists() && !file_cfg_dirisDirectory()) {
Systemoutprintln("配置文件夹Remote_Meeting不存在!");
ok = file_cfg_dirmkdirs();
if (ok) {
Systemoutprintln("创建文件夹成功!");
} else {
Systemoutprintln("创建文件夹失败!");
}
}
//判断配置文件是否存在
file_cfg = new File(file_cfg_dirgetPath(),"cfgxml");
if (!file_cfgexists())
{
Systemoutprintln("配置文件cfgxml不存在!");
try {
file_cfgcreateNewFile();
Systemoutprintln("创建文件cfgxml成功!");
//生成初始化的配置数据
try {
out = new FileOutputStream(file_cfg);
//保存默认配置
config_infotitle = "远程视频会见系统";
config_infolocal_port = 12600;
config_infoschedule_server_ip = "1058159";
config_infoschedule_server_port = 12601;
str = produce_xml_string(config_info);
outwrite(strgetBytes());
outclose();
} catch (IOException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
config_infotitle = "远程";
config_infolocal_port = 126;
config_infoschedule_server_ip = "105";
config_infoschedule_server_port = 12;
Systemoutprintf("----222222222%s,%d,%s,%d\n",config_infotitle,config_infolocal_port,
config_infoschedule_server_ip,config_infoschedule_server_port);
//解析xml文件
try {
in = new FileInputStream(file_cfg);
DocumentBuilderFactory factory = DocumentBuilderFactorynewInstance();
DocumentBuilder builder = factorynewDocumentBuilder();
Document document = builderparse(in);
// 获取根节点
Element root = documentgetDocumentElement();
NodeList node = rootgetChildNodes();
//获得第1子节点:标题
config_infotitle = nodeitem(0)getFirstChild()getNodeValue();
//获得第2子节点:本机端口
config_infolocal_port = IntegerparseInt(nodeitem(1)getFirstChild()getNodeValue());
//获得第3子节点:调度服务器ip
config_infoschedule_server_ip = nodeitem(2)getFirstChild()getNodeValue();
//获得第4子节点:调度服务器端口
config_infoschedule_server_port = IntegerparseInt(nodeitem(3)getFirstChild()getNodeValue());
Systemoutprintf("----222222222%s,%d,%s,%d\n",config_infotitle,config_infolocal_port,
config_infoschedule_server_ip,config_infoschedule_server_port);
} catch (Exception e) {
eprintStackTrace();
}
}
@Override
public Config_Info get_config_info() {
return config_info;
}
/
得到本机ip地址
@return 本机ip地址
/
private String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface
getNetworkInterfaces(); enhasMoreElements();) {
NetworkInterface intf = ennextElement();
for (Enumeration<InetAddress> enumIpAddr = intf
getInetAddresses(); enumIpAddrhasMoreElements();) {
InetAddress inetAddress = enumIpAddrnextElement();
//if (!inetAddressisLoopbackAddress()) {
if (!inetAddressisLoopbackAddress() && !(inetAddress instanceof Inet6Address)) {
return inetAddressgetHostAddress()toString();
}
}
}
} catch (SocketException ex) {
Loge("WifiPreference IpAddress", extoString());
}
return null;
}
/
生成xml配置文件的String数据流
Config_Info的本机ip信息不会保存
@param info:配置信息
@return xml的String数据流
/
private String produce_xml_string(Config_Info info) {
StringWriter stringWriter = new StringWriter();
try {
// 获取XmlSerializer对象
XmlPullParserFactory factory = XmlPullParserFactorynewInstance();
XmlSerializer xmlSerializer = factorynewSerializer();
// 设置输出流对象
xmlSerializersetOutput(stringWriter);
//开始标签
xmlSerializerstartDocument("utf-8", true);
xmlSerializerstartTag(null, "config");
//标题
xmlSerializerstartTag(null, "title");
xmlSerializertext(infotitle);
xmlSerializerendTag(null, "title");
//本机端口
xmlSerializerstartTag(null, "local_port");
xmlSerializertext(IntegertoString(infolocal_port));
xmlSerializerendTag(null, "local_port");
//调度服务器ip
xmlSerializerstartTag(null, "schedule_service_ip");
xmlSerializertext(infoschedule_server_ip);
xmlSerializerendTag(null, "schedule_service_ip");
//调度服务器端口
xmlSerializerstartTag(null, "schedule_service_port");
xmlSerializertext(IntegertoString(infoschedule_server_port));
xmlSerializerendTag(null, "schedule_service_port");
xmlSerializerendTag(null, "config");
xmlSerializerendDocument();
} catch (Exception e) {
eprintStackTrace();
}
return stringWritertoString();
}
}
我给你个示例代码,你自己改改增加子节点那一段就好了。
#!/usr/bin/python# -- coding=utf-8 --
# author : wklken@yeahnet
# date: 2012-05-25
# version: 01
from xmletreeElementTree import ElementTree,Element
def read_xml(in_path):
'''读取并解析xml文件
in_path: xml路径
return: ElementTree'''
tree = ElementTree()
treeparse(in_path)
return tree
def write_xml(tree, out_path):
'''将xml文件写出
tree: xml树
out_path: 写出路径'''
treewrite(out_path, encoding="utf-8",xml_declaration=True)
def if_match(node, kv_map):
'''判断某个节点是否包含所有传入参数属性
node: 节点
kv_map: 属性及属性值组成的map'''
for key in kv_map:
if nodeget(key) != kv_mapget(key):
return False
return True
#---------------search -----
def find_nodes(tree, path):
'''查找某个路径匹配的所有节点
tree: xml树
path: 节点路径'''
return treefindall(path)
def get_node_by_keyvalue(nodelist, kv_map):
'''根据属性及属性值定位符合的节点,返回节点
nodelist: 节点列表
kv_map: 匹配属性及属性值map'''
result_nodes = []
for node in nodelist:
if if_match(node, kv_map):
result_nodesappend(node)
return result_nodes
#---------------change -----
def change_node_properties(nodelist, kv_map, is_delete=False):
'''修改/增加 /删除 节点的属性及属性值
nodelist: 节点列表
kv_map:属性及属性值map'''
for node in nodelist:
for key in kv_map:
if is_delete:
if key in nodeattrib:
del nodeattrib[key]
else:
nodeset(key, kv_mapget(key))
def change_node_text(nodelist, text, is_add=False, is_delete=False):
'''改变/增加/删除一个节点的文本
nodelist:节点列表
text : 更新后的文本'''
for node in nodelist:
if is_add:
nodetext += text
elif is_delete:
nodetext = ""
else:
nodetext = text
def create_node(tag, property_map, content):
'''新造一个节点
tag:节点标签
property_map:属性及属性值map
content: 节点闭合标签里的文本内容
return 新节点'''
element = Element(tag, property_map)
elementtext = content
return element
def add_child_node(nodelist, element):
'''给一个节点添加子节点
nodelist: 节点列表
element: 子节点'''
for node in nodelist:
nodeappend(element)
def del_node_by_tagkeyvalue(nodelist, tag, kv_map):
'''同过属性及属性值定位一个节点,并删除之
nodelist: 父节点列表
tag:子节点标签
kv_map: 属性及属性值列表'''
for parent_node in nodelist:
children = parent_nodegetchildren()
for child in children:
if childtag == tag and if_match(child, kv_map):
parent_noderemove(child)
if __name__ == "__main__":
#1 读取xml文件
tree = read_xml("/testxml")
#2 属性修改
#A 找到父节点
nodes = find_nodes(tree, "processers/processer")
#B 通过属性准确定位子节点
result_nodes = get_node_by_keyvalue(nodes, {"name":"BProcesser"})
#C 修改节点属性
change_node_properties(result_nodes, {"age": "1"})
#D 删除节点属性
change_node_properties(result_nodes, {"value":""}, True)
#3 节点修改
#A新建节点
a = create_node("person", {"age":"15","money":"200000"}, "this is the firest content")
#B插入到父节点之下
add_child_node(result_nodes, a)
#4 删除节点
#定位父节点
del_parent_nodes = find_nodes(tree, "processers/services/service")
#准确定位子节点并删除之
target_del_node = del_node_by_tagkeyvalue(del_parent_nodes, "chain", {"sequency" : "chain1"})
#5 修改节点文本
#定位节点
text_nodes = get_node_by_keyvalue(find_nodes(tree, "processers/services/service/chain"), {"sequency":"chain3"})
change_node_text(text_nodes, "new text")
#6 输出到结果文件
write_xml(tree, "/outxml")
JAVA与XML文件,可以说是软件开发的“黄金搭档”,而如何使用JAVA完成对XML文件的读取,是我们首先要解决的问题。
一、XML文件
这个示例文件包括了用来打开ORACLE数据库的各种参数
<xml version="10" encoding="UTF-8">
<dbmsg>
<dbinfo>
<drivername>oraclejdbcdriverOracleDriver</drivername>
<sConnStr>jdbc:oracle:thin:@118822580:1521:VOUCHERDB</sConnStr>
<username>SYS AS SYSDBA</username>
<password>voucherdb</password>
</dbinfo>
</dbmsg>
二、编写类名为ReadXml的类,用于解析XML文件
我们要在应用程序中打开数据库,就必须完成对该文件中drivername、sConnStr、username、password的读取,通过查找有关资料,笔者编制了以下程序,用于读取文件名为filename的XML文件。
package voucherbasic;
import javaioFileInputStream;
import javaioFileNotFoundException;
import javaioIOException;
import javaioInputStream;
import javaxxmlparsersDocumentBuilder;
import javaxxmlparsersDocumentBuilderFactory;
import javaxxmlparsersParserConfigurationException;
import orgw3cdomDocument;
import orgw3cdomElement;
import orgw3cdomNode;
import orgw3cdomNodeList;
import orgxmlsaxSAXException;
public class ReadXml {
private String drivername;
private String sConnStr;
private String username;
private String password;
public String getDrivername() {
return drivername;
}
public String getSConnStr() {
return sConnStr;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public void setDrivername(String drivername) {
thisdrivername = drivername;
}
public void setSConnStr(String connStr) {
sConnStr = connStr;
}
public void setUsername(String username) {
thisusername = username;
}
public void setPassword(String password) {
thispassword = password;
}
public ReadXml(String fileName){
DocumentBuilderFactory domfac=DocumentBuilderFactorynewInstance();
try {
DocumentBuilder dombuilder=domfacnewDocumentBuilder();
InputStream is=new FileInputStream(fileName);
Document doc=dombuilderparse(is);
Element root=docgetDocumentElement();
NodeList dbinfo=rootgetChildNodes();
if(dbinfo!=null){
for(int i=0;i<dbinfogetLength();i++){
Node db=dbinfoitem(i);
for(Node node=dbgetFirstChild();node!=null;node=nodegetNextSibling()){
if(nodegetNodeType()==NodeELEMENT_NODE){
if(nodegetNodeName()equals("drivername")){
setDrivername(nodegetFirstChild()getNodeValue());
}
if(nodegetNodeName()equals("sConnStr")){
setSConnStr(nodegetFirstChild()getNodeValue());
}
if(nodegetNodeName()equals("username")){
setUsername(nodegetFirstChild()getNodeValue());
}
if(nodegetNodeName()equals("password")){
setPassword(nodegetFirstChild()getNodeValue());
}
}
}
}
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
}
这个以ReadXml命名的类,使用了参数为文件名的构造方法,用户只要将配置文件我名称传递给该方法,就可以完成对XML文件的解析,进而完成对相应参数数的读取。
三、如何获取XML文件全路径并读取配置参数
获取XML文件全路径的方法有两个,一是在servlet中获取,二是在单独的JAVA类中获取。
1在servlet中获取XML文件的全路径并读取配置参数
程序片段String dirPath = getServletContext()getRealPath( "/WEB-INF");
String fileName = dirPath + "/connxml";
ReadXml xm = new ReadXml(fileName);
String DriverName = xmgetDrivername();
String connStr = xmgetSConnStr();
String user = xmgetUsername();
String pas = xmgetPassword();
将这段程序添加到servlet中dopost()之后即可完成参数的读取
2在单独的JAVA类中获取全路径并读取配置参数
程序片段
String dirpath = SystemgetProperty("userdir");
String xmlFile = dirpath + "/WebRoot/WEB-INF/connxml";
ReadXml rdxml = new ReadXml(xmlFile);
String driverName = rdxmlgetDrivername();
String sConnStr = rdxmlgetSConnStr();
String userName = rdxmlgetUsername();
String passWord = rdxmlgetPassword();
注:配置文件connxml保存在webroot/WEB-INF目录中。
以上就是关于C#中如何读取XML内具体 某条数据 的信息全部的内容,包括:C#中如何读取XML内具体 某条数据 的信息、java获取XML路径提示空指针问题、怎么才能知道一个网站的XML地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)