getElementByTagname()getElementAtIndex()getFirstChild()getNextSibling()getTextContent()
现在我必须做同样的事情,但我想知道使用XSLT样式表是否会更好.向我们发送XML文件的组织不断更改其架构意味着我们必须更改我们的代码以满足这些shema更改.我不是很熟悉XSLT进程所以我试图找出是否更好地使用XSLT样式表而不是“手动解析”.
XSLT样式表看起来很有吸引力的原因是我认为如果XML文件的架构发生变化,我只需要更改样式表吗?它是否正确?
我想知道的另一件事是两者中的哪一个(XSLT转换器或DOM解析器)性能更好.对于手动选项,我只使用DOM解析器来解析xml文件. XSLT转换器如何实际解析文件?与手动解析xml文件相比,它是否包含额外的开销?我问的原因是性能很重要,因为我将处理的数据的性质.
有什么建议?
谢谢
编辑
基本上我目前正在做的是解析一个xml文件并处理一些xml元素中的值.我不会将xml文件转换为任何其他格式.我只是提取一些值,从Oracle数据库中提取一行并将一个新行保存到另一个表中.我解析的xml文件只包含用于从数据库中检索一些数据的引用值.
xslt不适合这种情况吗?如果架构发生变化,是否有更好的方法可以避免代码更改?
编辑2
对于我对XML数据所做的事情不够清楚而道歉.基本上有一个包含一些信息的XML文件.我从XML文件中提取此信息,并使用它从本地数据库中检索更多信息. xml文件中的数据更像是数据库中所需数据的引用键.然后,我使用XML文件中的特定密钥获取从XML文件中提取的内容以及从数据库中检索的内容,并将该数据保存到另一个数据库表中.
我遇到的问题是我知道如何编写一个DOM解析器来从XML文件中提取我需要的信息,但我想知道是否使用XSLT样式表是一个更好的选择,因为如果架构更改我不得不更改代码.
阅读下面的回复听起来像XSLT仅用于转换和XML文件到另一个XML文件或其他格式.鉴于我不打算转换XML文件,可能不需要添加解析XSLT样式表以及XML文件的额外开销.
解决方法 我认为你需要的实际上是一个XPath表达式.您可以在某些属性文件中配置该表达式,也可以使用任何用于检索设置参数的表达式.这样,只要您的客户隐藏您在其他地方使用的信息,就可以更改XPath表达式.
基本上,XSLT是一种矫枉过正,你只需要一个XPath表达式.单个XPath表达式将允许返回您所追求的每个值.
更新
由于我们现在谈论的是JDK 1.4,我在下面列出了使用XPath在XML文件中获取文本的3种不同方法. (尽可能简单,我不害怕NPE警卫队的毛茸茸;-)
从最新的开始.
0.首先是示例XML配置文件
<?xml version="1.0" enCoding="UTF-8"?><config> <param ID="MaxThread" desc="MaxThread" type="int">250</param> <param ID="rTmo" desc="RespTimeout (ms)" type="int">5000</param></config>
1.使用Java SE 5.0的JAXP 1.3标准部分
import javax.xml.parsers.*;import javax.xml.xpath.*;import org.w3c.dom.document;public class TestXPath { private static final String CFG_file = "test.xml" ; private static final String XPATH_FOR_PRM_MaxThread = "/config/param[@ID='MaxThread']/text()"; public static voID main(String[] args) { documentBuilderFactory docFactory = documentBuilderFactory.newInstance(); docFactory.setnamespaceAware(true); documentBuilder builder; try { builder = docFactory.newdocumentBuilder(); document doc = builder.parse(CFG_file); XPathExpression expr = XPathFactory.newInstance().newXPath().compile(XPATH_FOR_PRM_MaxThread); Object result = expr.evaluate(doc,XPathConstants.NUMBER); if ( result instanceof Double ) { System.out.println( ((Double)result).intValue() ); } } catch (Exception e) { e.printstacktrace(); } }}
2.使用Java SE 1.4-2的JAXP 1.2标准部分
import javax.xml.parsers.*;import org.apache.xpath.XPathAPI;import org.w3c.dom.*;public class TestXPath { private static final String CFG_file = "test.xml" ; private static final String XPATH_FOR_PRM_MaxThread = "/config/param[@ID='MaxThread']/text()"; public static voID main(String[] args) { try { documentBuilderFactory docFactory = documentBuilderFactory.newInstance(); docFactory.setnamespaceAware(true); documentBuilder builder = docFactory.newdocumentBuilder(); document doc = builder.parse(CFG_file); Node param = XPathAPI.selectSingleNode( doc,XPATH_FOR_PRM_MaxThread ); if ( param instanceof Text ) { System.out.println( Integer.decode(((Text)(param)).getNodeValue() ) ); } } catch (Exception e) { e.printstacktrace(); } }}
3.使用JAXP 1.1标准部分Java SE 1.4 jdom jaxen
你需要添加这两个罐子(可从www.jdom.org获得 – 二进制文件,包括jaxen).
import java.io.file;import org.jdom.*;import org.jdom.input.SAXBuilder;import org.jdom.xpath.XPath;public class TestXPath { private static final String CFG_file = "test.xml" ; private static final String XPATH_FOR_PRM_MaxThread = "/config/param[@ID='MaxThread']/text()"; public static voID main(String[] args) { try { SAXBuilder sxb = new SAXBuilder(); document doc = sxb.build(new file(CFG_file)); Element root = doc.getRootElement(); XPath xpath = XPath.newInstance(XPATH_FOR_PRM_MaxThread); Text param = (Text) xpath.selectSingleNode(root); Integer maxThread = Integer.decode( param.getText() ); System.out.println( maxThread ); } catch (Exception e) { e.printstacktrace(); } }}总结
以上是内存溢出为你收集整理的与使用DOM解析器手动解析XML文件相比,使用XSLT样式表有什么好处全部内容,希望文章能够帮你解决与使用DOM解析器手动解析XML文件相比,使用XSLT样式表有什么好处所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)