0

背景:Windows Azure;Visual Studio 社区 2015;清除脚本;脚本

我在将 XmlDocument 对象暴露给使用 ClearScript 执行的 JScript 时遇到问题。

我正在使用实例化一个 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. 根据另一个 StackOverflow 发布的字符编码。
  2. HTML-XML 标记冲突。
4

2 回答 2

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。对你起作用吗?

于 2016-01-22T04:55:59.240 回答
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;
于 2016-01-22T07:11:34.107 回答