#xml #jscript #wsh #xmldom
#xml #jscript #wsh #xmldom
Вопрос:
У меня много проблем с выяснением, как выбрать содержимое из определенных элементов HTML (которые на самом деле являются узлами) из HTML-файла.
Прежде всего, я признаю, что это не «правильно сформированный xml», но если это действительно не моя проблема, я сомневаюсь, что это действительно имеет значение. Возьмите этот файл:
<html>
<body id="464">
<div id="fullname"> Use Cases </div>
<div id="intro"> <b><font color="#000033">Use Cases </font></b> </div>
</body>
</html>
И этот очень простой код, который я извлек из своего полного скрипта:
xmlSourceTranslation = new ActiveXObject("Msxml2.DOMDocument.6.0");
xmlSourceTranslation.async="false";
xmlSourceTranslation.load(file.html);
xmlSourceTranslation = xmlSourceTranslation.documentElement;
var sourceNode = xmlSourceTranslation.selectSingleNode("//*[@id = 'fullname']");
if (typeof sourceNode === 'object') {
sourceText = sourceNode.firstChild.nodeValue;
}
Проблема в том, что в зависимости от того, получу ли я fullname
или intro
div, и метод, который я использую ( .firstChild.nodeValue
, .innerHTML
, .firstChild.innerHMTL
, .childNodes
), я либо получу значение null
, undefined
, либо я получу Object Required
ошибку при попытке доступа к нему. Единственный надежный метод, который я могу использовать, — это sourceNode.text
, который работает каждый раз, но получает только «варианты использования» в качестве значения в intro
div вместо HTML, который мне нужен.
Я почти 2 дня бил головой по столу, пытаясь разобраться.
Ответ №1:
- .для async требуется логическое (не строковое) значение
- .для загрузки требуется строка
- загромождение XML-объекта его documentElement — плохая идея
- использование .загрузка без проверки ошибок — плохая практика
- .SelectSingleNode возвращается
null
при сбое
Минимальный скелет для работы с XML (адаптирован для вашей проблемы):
var sFSpec = "..\data\24272956.xml";
var sXPath = "//*[@id = 'fullname']";
var oXml = new ActiveXObject("Msxml2.DOMDocument.6.0");
var sOtp = "???";
oXml.async = false;
if (oXml.load(sFSpec)) {
var ndDE = oXml.documentElement;
var ndSrc = ndDE.selectSingleNode(sXPath);
if (ndSrc !== null) {
sOtp = ndSrc.firstChild.nodeValue;
} else {
sOtp = "no node found for " sXPath;
}
} else {
sOtp = sFSpec ": " oXml.parseError.reason;
}
WScript.Echo(sOtp);
вывод (исправен):
cscript 24272956.js
Use Cases
примеры выходных данных (плохие):
cscript 24272956.js
..data24272956.nosuchfile: The system cannot locate the object specified.
cscript 24272956.js
no node found for //*[@id = 'Fullname']
cscript 24272956.js
..data24272956.xml: End tag 'Body' does not match the start tag 'body'.