Получение правильного HTML-содержимого DIV (JavaScript WSH, XMLDOM ActiveX)

#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:

  1. .для async требуется логическое (не строковое) значение
  2. .для загрузки требуется строка
  3. загромождение XML-объекта его documentElement — плохая идея
  4. использование .загрузка без проверки ошибок — плохая практика
  5. .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'.