c#如何读取xml中的信息并显示?

c#如何读取xml中的信息并显示?,第1张

最简单的方式是用
DataSetReadXml()
方法读入
XML
数据到一个DataTable中,然后把这个DataTable绑顶到你的下拉框上去即可。
如果你用自定义对象模型,不用DataSet存储数据,那就要用XmlDocument对象或XmlReader读取XML了。
XmlDocument提供了DOM模型访问XML,能够使用XPath技术访问XML中的任意节点
XmlReader提供了对XML数据的只读的流式访问,速度较快,但是只读向前的。
具体用那个,就看你的应用场合需要了。

第一种:使用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;
}

用c#中xml *** 作的相关类库。
首先确保你 的xml文件存在路径,然后通过xmldocument 这个类load入xml,再用xnode 读入每个节点即可。
或者你可以定义一个类
public class return{
public string result{get;set}
public string content{get;set}
}
然后通过反序列化将xml变成类的一个实例,然后使用returnresult 调用使用即可,不过这样会比较耗费资源。

已知有一个XML文件(bookstorexml)如下:
<xml version="10" encoding="gb2312">
<bookstore>
<book genre="fantasy" ISBN="2-3631-4">
<title>Oberon's Legacy</title>
<author>Corets, Eva</author>
<price>595</price>
</book>
</bookstore>
显示所有数据。
XmlNode xn=xmlDocSelectSingleNode("bookstore");
XmlNodeList xnl=xnChildNodes;

foreach(XmlNode xnf in xnl)
{
XmlElement xe=(XmlElement)xnf;
ConsoleWriteLine(xeGetAttribute("genre"));//显示属性值
ConsoleWriteLine(xeGetAttribute("ISBN"));
XmlNodeList xnf1=xeChildNodes;
foreach(XmlNode xn2 in xnf1)
{
ConsoleWriteLine(xn2InnerText);//显示子节点点文本
}
}

可以通过元素中的getText方法获取到节点的内容。
举例:
SAXReader sax = new SAXReader();
Document document = saxread(reader);//reader为定义的一个字符串,可以转换为xml
Element root = documentgetRootElement();//获取到根节点元素String str = root getText()//获取到节点的内容
用到的是dom4j-161jar,需要引入的包是:
import orgdom4jDocument;
import orgdom4jDocumentException;
import orgdom4jElement;
import orgdom4jioSAXReader;
备注:如果是多个子节点可以通过”Element xx=root element("code")“获取到子节点的元素,前提是需要知道子节点的名称。

在我们的程序中,通常要有一些根据主机环境确定的变量比如数据库访问用户名和密码,不同的主机可能设置不一样只要更改XML配置文件,就可以正常运行
localhost
sqlname
username
password
上面这个myenvxml配置文件一般是放在tomcat的WEB-INF/classes目录下
我们编制一个Java程序直接读取,将dbhost dbuser dbpassword提取出来供其他程序访问数据库用
目前使用SAX比较的多,与DOM主要区别是 SAX是一行一行读取XML文件进行分析,适合比较大文件,DOM是一次性读入内存,显然不能对付大文件这里我们使用SAX解析,由于SAX解析器不断在发展,网上有不少文章是针对老版本的假如你使用JDK14 ,可以参考 使用SAX处理XML文档 一文这里的程序是根据其改进并且经过实践调试得来的
对上面myenvxml读取的Java程序:
import orgxmlsaxAttributes;
import orgxmlsaxhelpersDefaultHandler;
import orgxmlsaxSAXException;
import javautilProperties;
//使用DefaultHandler的好处 是 不必陈列出所有方法,
public class ConfigParser extends DefaultHandler {
////定义一个Properties 用来存放 dbhost dbuser dbpassword的值
private Properties props;
private String currentSet;
private String currentName;
private StringBuffer currentValue = new StringBuffer();
//构建器初始化props
public ConfigParser() {
thisprops = new Properties();
}
public Properties getProps() {
return thisprops;
}
//定义开始解析元素的方法 这里是将中的名称xxx提取出来
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
currentValuedelete(0, currentValuelength());
thiscurrentName =qName;
}
//这里是将之间的值加入到currentValue
public void characters(char[] ch, int start, int length) throws SAXException {
currentValueappend(ch, start, length);
}
//在碰到结束后,将之前的名称和值一一对应保存在props中
public void endElement(String uri, String localName, String qName) throws SAXException {
propsput(qNametoLowerCase(), currentValuetoString()trim());
}
}
上面的这个解析程序比较简单吧 其实解析XML就是这么简单
现在我们已经将dbhost dbuser dbpassword的值localhost sqlname username password提取了出来但是这只是在在解析器内部,我们的程序还不能访问需要再编制一个程序
import javautilProperties;
import javaxxmlparsersSAXParser;
import javaxxmlparsersSAXParserFactory;
import javanetURL;
public class ParseXML{
//定义一个Properties 用来存放 dbhost dbuser dbpassword的值
private Properties props;
//这里的props
public Properties getProps() {
return thisprops;
}
public void parse(String filename) throws Exception {
//将我们的解析器对象化
ConfigParser handler = new ConfigParser();
//获取SAX工厂对象
SAXParserFactory factory = SAXParserFactorynewInstance();
factorysetNamespaceAware(false);
factorysetValidating(false);
//获取SAX解析
SAXParser parser = factorynewSAXParser();
//得到配置文件myenvxml所在目录 tomcat中是在WEB-INF/classes
//下例中BeansConstants是用来存放xml文件中配置信息的类,可以自己代替或定义
URL confURL = BeansConstantsclassgetClassLoader()getResource(filename);
try
{
//将解析器和解析对象myenvxml联系起来,开始解析
parserparse(confURLtoString(), handler);
//获取解析成功后的属性 以后 我们其他应用程序只要调用本程序的props就可以提取出属性名称和值了
props = handlergetProps();
}finally{
factory=null;
parser=null;
handler=null;
}
}
}
由于我们的XML文件是使用最简单的形式 ,因此解析器相对简单,但是这已经足够对付我们的配置文件了

如果是想获取oracle数据库里xmltype类型的xml数据,可以如下:
create
table
abc
(id
number,xmldoc
sysxmltype);
select
id,extract(xmldoc,'/chart/graphs')getStringVal()
as
A
from
abc;
是获取oracle数据库里其它类型如clob或varchar2类型的xml数据,则直接取出然后用oracle相关方法解析,网上搜索oracle解析xml,有很多相关资料


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

原文地址: https://outofmemory.cn/yw/13412091.html

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

发表评论

登录后才能评论

评论列表(0条)

保存