JavaScript中如何处理XML

459 阅读3分钟

这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

XML相关知识

Firefox为了专门为把XML解析为DOM文档新增了DOMParser类型,如果我们要使用DOMParser,首先需要创建一个实例,然后再调用parseFromString()方法。这个方法可以接收两个参数,分别为要解析的XML字符串和内容类型。返回值是Document的实例。DOMParser只能解析良好的XML,所以不能把HTML解析为HTML文档。在发生解析错误时,不同浏览器的行为也是不一样的。由于这些差异,所以我们最好使用try/catch来判断是否发生了解析错误,如果没有错误,则通过getElementsByTagName()方法查找文档中是否包含<parsererror>元素。

let arr = new DOMParser();
let dom = arr.parseFromString("<root><child/></root>", "text/xml");
console.log(dom.documentElement.tagName);
console.log(dom.documentElement.firstChild.tagName);
// 上面输出结果分别为root和child

createExpression用于根据 XPath 表达式及相应的命名空间从而计算得到一个XPathExpression

createNSResolver基于 node 的命名空间创建新的XPathNSResolver对象。当对使用名称空间的 XML 文档求值时,需要XPathNSResolver对象。

evaluate根据给定的上下文和命名空间对XPath进行求值。其他参数表示如何返回结果。 对于数值类型,XPath表达式必须使用返回数值的XPath函数,对于字符串类型,evaluate()方法查找匹配 XPath 表达式的第一个节点,然后返回其第一个子节点的值,前提是第一个子节点是文本节点。如果不是,就返回空字符串。所有 XPath 表达式都会自动映射到特定类型的结果。设置特定结果类型会限制表达式的输出。

对于使用命名空间的XML文档,必须告诉XPathEvaluator命名空间信息,才能进行正确求值。处理命名空间的方式有很多,第一种方法是通过createNSResolver()方法创建XPathNSResolver对象,这个方法只接收一个参数,就是包含命名空间定义的文档节点。第二种方法就是定义一个接收命名空间前缀并返回相应 URI 的函数,当我们不知道文档的哪个节点包含命名空间定义时,可以采用这种定义命名空间解析函数的方式。只要知道前缀和URI,就可以定义这样一个函数,然后把它作为第三个参数传给evaluate()

XMLSerializer类型

XMLSerializer类型可以把DOM文档序列化为XML字符串,当我们要序列化DOM文档,必须要创建XMLSerializer的新实例,然后把文档传递给serializeToString()方法。这个方法的返回值是打印不好的字符串。XMLSerializer能够序列化任何有效的DOM对象,包括个别节点和HTML文档。

let test = new XMLSerializer()
let zss = serializer.serializeToString(xml dom);
console.log('zss', zss)

XSLTProcessor

XSLTProcessor允许使用setParameter()方法设置XSLT参数,这个方法会接收三个参数,分别为命名空间URI、参数本地名称和设置的值。其中命名空间URI是null,本地名称就是参数名称。每g个XSLTProcessor实例都可以重用于多个转换,只是要使用不同的 XSLT 样式表。处理器的reset()方法可以删除所有参数和样式表。我们还可以使用importStylesheet()方法加载不同的XSLT样表。还有两种新的类型,分别为DOMParser类型是简单的对象,可以将XML字符串解析为DOM文档和XMLSerializer类型执行相反操作,将DOM文档序列化为XML字符串。

let zss = new XSLTProcessor();
zss.importStylesheet(xsltdom);