我阅读了一些关于XML解析器的文章,并且遇到了SAX和DOM.
SAX是基于事件的,DOM是树模型 - 我不理解这些概念之间的差异.
根据我的理解,基于事件意味着某种事件发生在节点上.就像当单击特定节点时,它将给出所有子节点,而不是同时加载所有节点.但是在DOM解析的情况下,它将加载所有节点并创建树模型.
我的理解是否正确?
请纠正我如果我错了或以更简单的方式向我解释基于事件和树模型.
有没有办法使用querySelector
或进行通配符元素名称匹配querySelectorAll
?我在属性查询中看到了对通配符的支持,但对于元素本身却没有.
我试图解析的XML文档基本上是一个扁平的属性列表,我需要找到名称中包含某些字符串的元素.
我意识到如果我需要这个XML文档可能需要重组,但这不会发生.
除了回到使用明显弃用的XPath(IE9丢弃它)之外的任何解决方案都是可以接受的.
我需要能够使用JavaScript解析XML.XML将在一个变量中.我宁愿不使用jQuery或其他框架.
我看过这个,XML> jQuery阅读.
我有以下html:
<html>
<body>
bla bla bla bla
<div id="myDiv">
more text
<div id="anotherDiv">
And even more text
</div>
</div>
bla bla bla
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我希望从<div id="anotherDiv">
关闭之前删除所有内容<div>
.我怎么做?
我使用以下代码将字符串解析为DOM:
var doc new DOMParser().parseFromString(string, 'text/xml');
Run Code Online (Sandbox Code Playgroud)
string
只是在哪里<!DOCTYPE html><html><head></head><body>content</body></html>
.
typeof doc
给了我object
.如果我这样做,doc.querySelector('body')
我会得到一个DOM对象.但是,如果我尝试访问任何属性,就像你通常可以,它给了我undefined
:
doc.querySelector('body').innerHTML; // undefined
Run Code Online (Sandbox Code Playgroud)
其他属性也是如此,例如id
.另一方面,属性检索很顺利doc.querySelector('body').getAttribute('id');
.
是否有魔术功能可以访问这些属性?
如果你从MDN看一下DOMParser的例子:
var parser = new DOMParser();
var doc = parser.parseFromString(stringContainingXMLSource, "application/xml");
// returns a Document, but not a SVGDocument nor a HTMLDocument
parser = new DOMParser();
doc = parser.parseFromString(stringContainingXMLSource, "image/svg+xml");
// returns a SVGDocument, which also is a Document.
parser = new DOMParser();
doc = parser.parseFromString(stringContainingHTMLSource, "text/html");
// returns a HTMLDocument, which also is a Document.
Run Code Online (Sandbox Code Playgroud)
他们不断创建new DOMParser
实例.但为什么?一个解析器实例不足够吗?那些进行大量解析的代码,在创建新实例方面是否具有性能优势?
编辑:人们正在挂起这个例子.更好地说出我的问题:为什么不DOMParser
更喜欢JSON
和它的parse
方法?为什么不是 parseFromString
静态方法?
我想知道Android中的XML SAX解析器,Pull解析器和DOM解析器之间的区别.在哪种情况下,哪一个在性能和实施方面更好?
感谢名单.Khobaib.
在我使用WYSIWYG之一的角度应用程序中,我可以插入没有协议的链接.这很糟糕:
我需要解析字符串并更改所有链接(如果没有协议到http:// ..).
我试着这样做:
var content = '<p>7</p><p>77</p><p><br></p><p><a href="http://example.com" rel="nofollow">http://example.com</a></p><p><br></p><p><a href="example.com" target="_blank">example.com</a></p><p><br></p><p><a href="ftp://localhost">ftp://localhost</a></p><p><br></p><p><a href="localhost">localhost</a><br></p>';
var addProtocolToLinks = function(URL){
var protocols = ['http', 'https', 'ftp', 'sftp', 'ssh', 'smtp'];
var withProtocol = false;
if (URL.length > 0){
protocols.forEach(function(el) {
if (URL.slice(0,4).indexOf(el) > -1){
withProtocol = true;
}
});
var newURL = URL;
if (!withProtocol){
newURL = 'http://' + URL;
}
console.log(newURL + ' ' + URL);
return newURL;
}
};
var parser = new DOMParser();
var doc = parser.parseFromString(content, "text/html"); …
Run Code Online (Sandbox Code Playgroud) 使用org.xml.sax.helpers.DefaultHandler
,可以确定您是否在其中的叶节点上endElement(String, String, String)
?
还是需要使用DOM解析器来确定?