gpt4 book ai didi

javascript - 对动态创建的文档的 XPath 评估不起作用

转载 作者:行者123 更新时间:2023-11-30 13:59:03 29 4
gpt4 key购买 nike

根据 Mathias 的评论更新/简化:

我正在尝试动态创建 HTML 文档,然后通过 XPath 在 DOM 中查找元素。

奇怪的是创建的 Document 看起来构造正确并使用 document.querySelector('<some el>') 查询它例如按预期工作。

然而,document.evaluate总是为每个 XPath 返回 null。

更新#2:这适用于 Chrome + Safari。在 Firefox 中一切都按预期工作。

function createDocumentFromHTMLContent(htmlContent) {
const htmlEl = document.createElement('HTML');
htmlEl.innerHTML = htmlContent;

const doctype = document.implementation.createDocumentType('html', '', '');
const doc = document.implementation.createDocument('', 'html', doctype);
doc.replaceChild(htmlEl, doc.firstElementChild);
return doc;
}

function getElementByXpath(path, doc) {
doc = doc || document;
return doc.evaluate(path, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}

const pageContent = `
<!DOCTYPE html>
<html>
<head>
<title>Yup</title>
</head>
<body>
<h1>Title</h1>
</body>
</html>
`;

const doc = createDocumentFromHTMLContent(pageContent);
const xpath = '/html[1]/body[1]/h1';
const onDoc = {
viaXPath: getElementByXpath(xpath, doc),
viaSelector: doc.querySelector('h1'),
};

const onDocument = {
viaXPath: getElementByXpath(xpath, document),
viaSelector: document.querySelector('h1'),
};

const summarize = (obj) => `XPath El: ${!!obj.viaXPath}, Selector El: ${!!obj.viaSelector}`;

const summaryEl = document.createElement('p');
summaryEl.innerHTML = `Via Document: ${summarize(onDocument)}<br />Via Doc: ${summarize(onDoc)}`;
document.body.appendChild(summaryEl);

这是 JSFiddle 中的上述内容:https://jsfiddle.net/two2hg0z/

我不明白为什么 XPath 选择适用于一个文档对象,但不适用于另一个。

感谢任何帮助!非常难过。

最佳答案

我不完全确定在 webkit 浏览器中会发生什么,可能他们不喜欢 Document.replaceChild documentElement ,或者可能是因为您在 <html> 中设置了一些实际上无效的标记元素(例如 Doctype 实际上应该设置在外部,它不能包含 节点等。但是无论如何, 将字符串解析为文档的正确方法是通过使用 DOMParser :

function createDocumentFromHTMLContent(htmlContent) {
return new DOMParser().parseFromString(htmlContent, 'text/html');
}

function getElementByXpath(path, doc) {
doc = doc || document;
return doc.evaluate(path, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}

const pageContent = `
<!DOCTYPE html>

<html>
<head>
<title>Yup</title>
</head>
<body>
<h1>Title</h1>
</body>
</html>
`;
const doc = createDocumentFromHTMLContent(pageContent);

const xpath = '/html[1]/body[1]/h1';
const onDoc = {
viaXPath: getElementByXpath(xpath, doc),
viaSelector: doc.querySelector('h1'),
};

const onDocument = {
viaXPath: getElementByXpath(xpath, document),
viaSelector: document.querySelector('h1'),
};

const summarize = (obj) => `XPath El: ${!!obj.viaXPath}, Selector El: ${!!obj.viaSelector}`;

const summaryEl = document.createElement('p');
summaryEl.innerHTML = `Via Document: ${summarize(onDocument)}<br />Via Doc: ${summarize(onDoc)}`;
document.body.appendChild(summaryEl);
<h1>Title</h1>

请注意,如果不是替换 documentElement ,你做了set its innerHTML to the one of your generated HTMLElement , 它也可以在 Chrome 中使用,但不再适用于 Firefox ;-)

关于javascript - 对动态创建的文档的 XPath 评估不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56697098/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com