2017-09-05 34 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到一個文件中。