如何利用xsl提取XML文档中某元素的属性值,为什么出现乱码

如何利用xsl提取XML文档中某元素的属性值,为什么出现乱码,第1张

现在写一个xsl文件,要提取出来所有c元素的parm1值,我是这样写的:

<xml   version="10"   encoding="GB2312">   

  <xsl:stylesheet   version="10"   xmlns:xsl="rm">   

  <xsl:param   name="AttName">parm1</xsl:param>   

  <xsl:template   match="c">   

  <xsl:value-of   select="@[name()=$AttName]"/>   

  </xsl:template>   

  </xsl:stylesheet>

我给你个提取xml内容的示例,,至于怎么生成excel,那就得加工处理下。(比如说提取内容后,再插入到excel),有一点要注意的是,你必须知道xml的节点,不然没办法 *** 作

//strRead 是xml内容

XmlDocument xd = new XmlDocument();

xdLoadXml(strRead);

XmlNodeList nodeList = xdSelectSingleNode("root")ChildNodes;//获取root节点的所有子节点

foreach (XmlNode xn in nodeList)//遍历所有子节点

{

XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型

if (xeName == "result")

{

XmlNodeList nls = xeChildNodes;//继续获取xe子节点的所有子节点

if (nlsCount > 0)

{

XmlNode xnValue = nlsItem(0); //节点的项,这个再根据情况判断

if(xnValueValueToLower()=="all")

Dgrid1ReadOnly = false;

else

Dgrid1ReadOnly = true;

}

}

}

java读取xml节点元素,主要使用java提供的解析xml的工具类SAXParserFactory,如下代码:

package xmlxmlreader;

import javaioFile;

import javanetURL;

import javautilProperties;

import javaxxmlparsersSAXParser;

import javaxxmlparsersSAXParserFactory;

public class CFGParser {//解析xml文件的工具类

    private Properties props;

    public Properties getProps() {

        return props;

    }

    public void setProps(Properties props) {

        thisprops = props;

    }

    public void parse(String filename) throws Exception

    {

        CFGHandler handler = new CFGHandler();

        SAXParserFactory factory = SAXParserFactorynewInstance();

        factorysetNamespaceAware(false);

        factorysetValidating(false);

        SAXParser parser = factorynewSAXParser();

        URL confURL = supergetClass()getClassLoader()getResource(filename);

        if (confURL == null) {

            Systemoutprintln("Can't find configration file");

            return;

        }

        try

        {

            parserparse(confURLtoString(), handler);

            thisprops = handlergetProps();

        }

        finally {

            factory = null;

            parser = null;

            handler = null;

        }

    }

    public void parseFile(String filename)

    throws Exception

    {

        CFGHandler handler = new CFGHandler();

        SAXParserFactory factory = SAXParserFactorynewInstance();

        factorysetNamespaceAware(false);

        factorysetValidating(false);

        SAXParser parser = factorynewSAXParser();

        File f = new File(filename);

        if ((f == null) || (!fexists()))

            return;

        try

        {

            parserparse(f, handler);

            thisprops = handlergetProps();

        }

        finally {

            factory = null;

            parser = null;

            handler = null;

        }

    }

}

package xmlxmlreader;

import javautilProperties;

import orgxmlsaxAttributes;

import orgxmlsaxSAXException;

import orgxmlsaxhelpersDefaultHandler;

public class CFGHandler extends DefaultHandler

{

  private Properties props;

  private String currentSet;

  private String currentName;

  private StringBuffer currentValue = new StringBuffer();

  public CFGHandler()

  {

    thisprops = new Properties();

  }

  public Properties getProps() {

    return thisprops;

  }

  public void startElement(String uri, String localName, String qName, Attributes attributes)

    throws SAXException

  {

    thiscurrentValuedelete(0, thiscurrentValuelength());

    thiscurrentName = qName;

  }

  public void characters(char[] ch, int start, int length) throws SAXException

  {

    thiscurrentValueappend(ch, start, length);

  }

  public void endElement(String uri, String localName, String qName)

    throws SAXException

  {

    thispropsput(qNametoLowerCase(), thiscurrentValuetoString()trim());

  }

}

xml文件

<xml version="10" encoding="UTF-8">

<xml-body>

        <refresh_userlist desc="用户列表刷新间隔时间(秒)">6</refresh_userlist>

        <refresh_message desc="短消息刷新间隔时间(秒)">10</refresh_message>

        <morningbegin desc="上午上班时间">23:00</morningbegin>

        <morningend desc="上午下班时间">12:00</morningend>

        <afternoonbegin desc="下午上班时间">18:00</afternoonbegin>

</xml-body>

jsp获取各个节点的值:

<%@ page language="java" import="javautil" pageEncoding="UTF-8"%>

<html>

    <jsp:useBean id="cfgp" scope="page" class="xmlxmlreaderCFGParser"></jsp:useBean>

    <body>

        <%

   cfgpparse("kaoqinxml");

   Properties pro = cfgpgetProps();

   String stTime = progetProperty("morningbegin");

   String edTime = progetProperty("morningend");

    String afternoonbegin = progetProperty("afternoonbegin");

   

   outprintln(stTime+"\n"+edTime+"\n"+afternoonbegin);

   Systemoutprintln(stTime+"\n"+edTime+"\n"+afternoonbegin);

    %>

    </body>

</html>

控制台应用程序中测试 static void Main(string[] args) { XmlDocument xd = new XmlDocument(); xdLoad("XMLFile1xml"); ConsoleWriteLine("根据节点的Name查找,请输入Name:"); string name = ConsoleReadLine()

本文通过一个详细的例子 来阐述了在线编辑XML文档数据的方法 由于Netscape对XML的支持比较弱 因此 要实现跨平台的数据交换 数据的处理必须在服务器端进行 要编辑XML文档 首先要做的事情就是怎样把这些数据提取并显示给访问者 XSL为我们显示XML文件提供了一个很好的解决方案 下面的例子就是利用XSL样式单把XML文档显示出来 供用户进行编辑 然后再把编辑后的数据提交到服务器 在服务器端进行数据的更新 这里采用ASP(Active Server Pages)来完成我们的任务 首先 载入我们要进行编辑的XML文档 利用微软的文档对象模型(Microsoft XMLDOM Object)和XSL XML文档就可以在服务器端转换成可以在客户端显示的HTML文件内容 下面先看看我们使用的XML和XSL文件是什么样子的 XML文件 UserData xml<xml version= encoding= gb ><! edited with XMLSPY v rel U () by Dicky (Apple S Eden) ><UserInfo><Field ID= Name TabOrder= ><FieldValue>Dicky</FieldValue></Field><Field ID= Sex TabOrder= ><FieldValue>Male</FieldValue></Field><Field ID= UnitName TabOrder= ><FieldValue>ShangHai Ateam Company</FieldValue></Field><Field ID= Address TabOrder= ><FieldValue>ShangHai ZhongShan West Road # Room A</FieldValue></Field><Field ID= Tel TabOrder= ><FieldValue> </FieldValue></Field><Field ID= EMail TabOrder= ><FieldValue>AppleBBS@GMail Com</FieldValue></Field></UserInfo>XSL文件 UserData xsl<xml version= encoding= gb ><! edited with XMLSPY v rel U () by Dicky (Apple S Eden) ><xsl:stylesheet xmlns:xsl= xsl ><xsl:template match= / ><><meta equiv= Content Type content= text/; charset=gb /><body><form method= post action= EditUserData asp ><h >Edit UserInfo </h ><table border= cellpadding= ><xsl:for each select= UserInfo/Field ><tr><td><xsl:value of select= @ID /></td><td><input type= text ><xsl:attribute name= ID ><xsl:value of select= @ID /></xsl:attribute><xsl:attribute name= Name ><xsl:value of select= @ID /></xsl:attribute><xsl:attribute name= Value ><xsl:value of select= FieldValue /></xsl:attribute></input></td></tr></xsl:for each></table><br/><input type= submit id= btnSubmit name= btnSubmit value= Edit /></form></body></></xsl:template></xsl:stylesheet>XSL文件使用了XSL for each元素的来遍历整个XML文件 XML文件里每个 field 元素的 id 属性和HTML表单的文本输入框的 id 和 name 相对应 这样 HTML表单的文本输入框就显示出了XML文件的元素值 此文件负责XML文档在服务器端的转换 以便能在各种浏览器上显示 下面是关键的程序 它实现打开和更新XML文档的功能 并根据表单的提交与否 来决定是否进行更新 它包含了两个函数 loadXMLFile负责载入和转换要显示的XML文件 updateXML函数负责更新XML文件 EditUserData asp程序如下:<% 定义函数 LoadXMLFile() 接收二个参数 strXMLFile XML 文件的路径和文件名字 strXSLFilee XSL 文件的路径和文件名字 Function LoadXMLFile(strXMLFile strXSLFile) Declare local variablesDim objXMLDim objXSL 实例化 XMLDOM 对象 以便载入 XML 文件 Set objXML = Server CreateObject( Microsoft XMLDOM ) 关掉文件异步载入模式 objXML Async = False 载入 XML 文件!objXML Load(strXMLFile) 实例化 XMLDOM 对象 以便载入 XSL 文件 Set objXSL = Server CreateObject( Microsoft XMLDOM ) 关掉文件异步载入模式 objXSL Async = False 载入 XSL 文件!objXSL Load(strXSLFile) 利用 XMLDOM 的 transformNode 方法 把 XSL 样式表应用到 XML 文档 然后输出到客户端 Response Write(objXML TransFormNode(objXSL))End Function 函数 updateXML() 接收一个参数 strXMLFile XML 文件的路径和文件名 Function UpdateXML(strXMLFile) 声明局部变量 Dim objDomDim objRootDim objFieldDim x 实例化 XMLDOM 对象 Set objDOM = Server CreateObject( Microsoft XMLDOM ) 关掉文件异步载入模式 objDom Async = False 载入 XML 文件 objDom Load strXMLFile 设定根元素 Set objRoot = objDom DocumentElement 遍历 FORM 集合 并把提交的数据写入 XML 文件 For x = To Request Form Count 检查提交的数据是否包含按钮 如果是 忽略此数据 If Instr( Request Form Key(x) btn ) = Then 按照 XSL 查询模式 建立 objField 变量 把表单的元素对应到 XML 文档里的相应元素[field_value] Set objField = objRoot SelectSingleNode( Field[@ID= & Request Form Key(x) & ]/FieldValue ) 把表单提交的数据和 XML 文档里的节点值对应起来 objField Text = Request Form(x)End IfNext 保存编辑过的 XML 文件 objDom Save strXMLFile 释放所有对对象的引用 Set objDom = NothingSet objRoot = NothingSet objField = Nothing 调用 LoadXMLFile 函数 把新编辑后的 XML 文件用 UpdatedUserData xsl 样式单显示到客户端 LoadXMLFile strXMLFile Server MapPath( UpdatedUserData xsl )End Function 检查表单是否成功提交 如提交 更新 XML 文件 否则 转到编辑状态 If Request Form( btnSubmit ) = ThenLoadXMLFile Server MapPath( UserData xml ) Server MapPath( UserData xsl )ElseUpdateXML Server MapPath( UserData xml )End If%>当表单提交成功后 我们用UpdatedUserData xsl来显示我们刚刚编辑的数据 UpdatedUserData xsl如下:<xml version= encoding= gb ><! edited with XMLSPY v rel U () by Dicky (Apple S Eden) ><xsl:stylesheet xmlns:xsl= xsl ><xsl:template match= / ><><meta equiv= Content Type content= text/; charset=gb /><body><h >Updated UserInfo </h ><table border= cellpadding= ><xsl:for each select= UserInfo/Field ><tr><td><xsl:value of select= @ID /></td><td><xsl:value of select= FieldValue /></td></tr></xsl:for each></table><form><input type= button value= Go Back onclick= history go( ) /></form></body></></xsl:template></xsl:stylesheet>以上只是XML跨平台应用的一个简单的例子 结合具体的需求 我们可以编写功能更强大的程序来完成我们更负杂的工作 所有程序在Windows En+IIS +IE +MSXML Dll环境下调试通过 lishixinzhi/Article/program/net/201311/13728

dom是用来解析xml的这是对的,但是xsl并不是用来解析xml的。

xsl的作用是把给定的xml转换为其他的格式,比如html、text、另外一种格式的xml等。

xsl的更详细内容可以看看:>

java中获取xml节点元素值 根据不同的处理xml方式不同而不同。

java中解析xml的方式:大体可以使用以下四种

------------------------------------------------------------

DOM(Document Object Model)

为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,

然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来 *** 作这个树结构。

优点:整个文档树在内存中,便于 *** 作;支持删除、修改、重新排列等多种功能;

缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;

使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)

SAX(Simple API for XML)

为解决DOM的问题,出现了SAX。SAX ,事件驱动。

当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,

程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;

SAX解析器代码比DOM解析器代码小,适于Applet,下载。

缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;

从事件中只能得到文本,但不知该文本属于哪个元素;

使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;

DOM4J

DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,

同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,

特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J

JDOM

为减少DOM、SAX的编码量,出现了JDOM;优点:20-80原则,极大减少了代码量。

使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。

------------------------------

参考代码

dom4j

------------------------------

import orgdom4jDocument;

import orgdom4jDocumentException;

import orgdom4jDocumentHelper;

import orgdom4jElement;

import orgdom4jioSAXReader;

import orgdom4jioXMLWriter;

---------------------------------------------

File f = new File("studentsxml");

SAXReader reader = new SAXReader();

Document doc = readerread(f);

Element root = docgetRootElement();

for (Iterator iter = rootelementIterator(); iterhasNext();) {

Element element = (Element) iternext();

// Systemoutprintln(elementattributeValue("email"));

String ids=elementelementText("stuId");

Systemoutprintln(ids);

String names=elementelementText("stuName");

Systemoutprintln(names);

String ages=elementelementText("age");

Systemoutprintln(ages);

}

------------------------------------

dom 方式

---------------

import javaxxmlparsers;

import javaxxmltransform;

import javaxxmltransformdomDOMSource;

import javaxxmltransformstreamStreamResult;

------------------------

DocumentBuilderFactory factory = DocumentBuilderFactorynewInstance();

// 允许名字空间

// factorysetNamespaceAware(true);

// 允许验证

// factorysetValidating(true);

// 获得DocumentBuilder的一个实例

DocumentBuilder builder = null;

try {

builder = factorynewDocumentBuilder();

} catch (ParserConfigurationException pce) {

Systemerrprintln(pce);

// 出异常时输出异常信息,然后退出,下同

Systemexit(1);

}

Document doc = null;

// 解析文档,并获得一个Document实例。

try {

try {

// InputStream is=new FileInputStream("studentsxml");

doc = builderparse("studentsxml");

// doc = builderparse(is);

} catch (SAXException e) {

// TODO Auto-generated catch block

eprintStackTrace();

}

} catch (DOMException dom) {

Systemerrprintln(domgetMessage());

Systemexit(1);

} catch (IOException ioe) {

Systemerrprintln(ioe);

// Systemexit(1);

}

for (int i = 0; i < nlStudentgetLength(); i++) {

Element elmtStudent = (Element) nlStudentitem(i);

String email = elmtStudentgetAttribute("email");

Systemoutprintln(email);

NodeList ids = elmtStudentgetElementsByTagName("stuId");

Element id = (Element)idsitem(0);

Node tId = idgetFirstChild();

Systemoutprintln(tIdgetNodeValue());

NodeList names = elmtStudentgetElementsByTagName("stuName");

Element e = (Element)namesitem(0);

Node tName = egetFirstChild();

Systemoutprintln(tNamegetNodeValue());

}

以上就是关于如何利用xsl提取XML文档中某元素的属性值,为什么出现乱码全部的内容,包括:如何利用xsl提取XML文档中某元素的属性值,为什么出现乱码、c#根据xml,xsl生成excel报表、java如何读取xml节点元素值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/9461515.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存