2017-09-05 31 views
0

我试图使用VBA在XML输入上运行XSLT转换。当我在Oxygen(使用Saxon)中运行XSLT时,XSLT工作得很好,但其目的是将其打包成一个“一键式”可执行文件,供没有Oxygen许可证的人使用。由于未定义实体,Visual Basic未能加载XML

我的问题是,在DOMDocument.load步骤的视觉基本扼流圈和死亡。

下面的代码示例:

Dim inDoc = New MSXML.DOMDocument 
inDoc.validateOnParse = False 
inDoc.resolveExternals = False 
inDoc.load([filepath here]) 

下面是XML的一个代表性位:

<permissions> 
    <copyright-statement>&copy; 2017 Copyright Owner</copyright-statement> 
</permissions> 

它失败,“引用未定义的实体‘复制’。”

我无法控制传入的XML - 我必须使用我所给予的 - 所以有办法强制load方法停止检查文件的内容吗?

+4

©是HTML中的有效命名实体,但不是XML,其存在使得文档不可解析。一种选择是预处理字符串并用符号替换实体(保存为utf8)或将其替换为字符代码escape&#char_code –

+0

另外,请考虑添加['<!Entity'](https:// msdn。 microsoft.com/en-us/library/ms256483(v=vs.110).aspx)可能在XSLT步骤。另请参阅[以XML添加实体](https://www.ibm.com/developerworks/library/x-entities/index.html)IBM读取。 – Parfait

+0

'Dim inDoc =新的MSXML.DOMDocument'不是有效的VBA代码。如果您使用的是Microsoft Visual Studio编码,那么您正在编写VB.NET,并且一定要考虑查看LINQ-to-XML可以为您做些什么。如果您使用嵌入在Microsoft Office应用程序中的1999年编辑器进行编码,则您正在编写VBA代码,并且您发布的内容无法编译。请相应地标记您的问题。 –

回答

0

我发现了一种基于Alex K的建议工作的方法。这感觉很粗糙,但它做我需要它做的事情,所以也许有助于其他人使用不完善的投入?

首先读取整个XML文件转换成字符串,然后运行以下命令:

inString = System.Web.HttpUtility.HtmlEncode(inString) 
inString = Replace(inString, "&lt;", "<") 
inString = Replace(inString, "&gt;", ">") 
inString = Replace(inString, "&quot;", """") 

inDoc.loadXML(inString) 
outString = inDoc.transformNode(xsl) 
outString = System.Web.HttpUtility.HtmlDecode(outString) 

,然后写outString到一个文件中。