C#中如何读取XML内具体 某条数据 的信息

C#中如何读取XML内具体 某条数据 的信息,第1张

第一种:使用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地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/10140844.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存