2016-01-22 14 views
0

Контекст: Windows Azure; Сообщество Visual Studio 2015; ClearScript; JScriptТрудно разоблачить XmlDocument для JScript с использованием ClearScript

У меня возникли проблемы с объектом XmlDocument для JScripts, выполняемого с использованием ClearScript.

Я инстанцировании интерпретатор JScript с использованием

JScriptEngine JSengine = new JScriptEngine(WindowsScriptEngineFlags.EnableDebugging | WindowsScriptEngineFlags.EnableJITDebugging); 

Чтобы создать экземпляр объекта XmlDocument я попытался как

using System.Xml; 
... 
JSengine.AddHostType("CSXmlDocument", typeof(XmlDocument)); 
... 

и

... 
JSengine.AddCOMObject("CSXmlDocument", "MSXML2.DOMDocument"); 
... 

и я выполнить сценарий JScript с использованием этого

... 
object answer = JSengine.Evaluate(File.ReadAllText(rulesetFilename)); 
... 

Моя трудность заключается в использовании объекта CSXmlDocument внутри скрипта. Я пробовал все следующие безрезультатно.

var xmlObj1 = CSXmlDocument; 
var xmlObj2 = new CSXmlDocument; 
var xmlObj3 = CSXmlDocument(); 
var xmlObj4 = new CSXmlDocument(); 

Когда CSXmlDocument определяются с помощью AddCOMObject, второй по четвертым заклятиям дают ошибку

Unable to evaluate the expression. Operation not supported. Unknown error: 0x8013baff. 

Первый вызов только дает мне доступ к трем методам, Equals, GetHashCode, GetType.

Когда CSXmlDocument определяется с использованием AddHostType, первый дает только три метода, как указано выше. Второй вызов, кажется, дает доступ к полному набору свойств и методов (по крайней мере, вот что говорит VS2015 в сеансе отладки), однако, когда я пытаюсь использовать метод LoadXml я получаю

xmlObj2.LoadXml(body) 
Unable to evaluate the expression. Operation not supported. Unknown error: 0x8013baff. 

Сейчас я работаю через две возможные ошибки:

  1. Кодировка символов, в свете another StackOverflow posting.
  2. Контексты разметки HTML-XML.

ответ

1

Хм, я не уверен, что вы делаете по-другому, но следующие работы для меня:

using (var JSengine = new JScriptEngine()) 
{ 
    JSengine.AddHostType("CSXmlDocument", typeof(XmlDocument)); 
    JSengine.AddHostType("CSConsole", typeof(Console)); 
    JSengine.Execute(@" 
     var doc = new CSXmlDocument(); 
     doc.LoadXml('<Hello>World</Hello>'); 
     var node = doc.FirstChild; 
     CSConsole.WriteLine('{0} {1}!', node.Name, node.InnerText);"); 
} 

Это дает ожидаемый результат «Hello World!» с ClearScript 5.4.4. Работает ли это для вас?

+0

Это работало для меня тоже. Интересно. – bugmagnet

0

Вместо того чтобы проходить в объекте, я решил создать объект в скрипте. Таким образом, у меня есть

var htmlDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.6.0"); 

Какие преимущества есть в использовании FreeThreaded я не знаю, но это работает.

я до сих пор проблемы, заметьте, с каким MSXML2 был обработки HTML я бросание на него, и пришлось добавить следующее

htmlDoc.setProperty("ProhibitDTD", false); 
htmlDoc.validateOnParse = false; 

Также MSXML2 не может справиться с &nbsp;, так что я выгружена, что для его характер эквивалент:

body = body.replace(/&nbsp;/g, "&#160;"); 

ProhibitDTD означает, что рвет на DOCTYPE также требуется, а именно

body = body.replace("<!DOCTYPE html>", ""); 

Со всем, что сделано, остальное произошло довольно быстро:

htmlDoc.loadXML(body); 
leadLink = htmlDoc.selectNodes('//*[@title="View this lead"]')[0].attributes[0].value; 
+0

Я не эксперт по XML, но 'XmlDocument' также отклоняет сущность' nbsp' при предоставлении простого текста, но он выдает исключение с полезным сообщением, объясняя, что сущность не определена. В любом случае, я не уверен, почему вы хотите использовать 'ActiveXObject'/MSXML в этой среде; класс .NET кажется более простым в использовании и работает с другими механизмами сценариев. – BitCortex

+0

Верно, и я все еще могу вернуться к нему, как только выясню, как заставить его работать. Тем временем у меня есть рабочий инструмент. – bugmagnet