2011-05-17 35 views
2

所以我想在VB6中使用SAX解析(用於古老的COM組件)來編輯xml(輸出是一個xml)。我更喜歡使用DOM解析,但是xml的大小(超過20MB的可能)迫使我使用SAX。我相對較新的VB6,我沒有經驗的SAX解析。我在網上查了一下,但即使是我發現的最好的資源(http://www.developerfusion.com/article/84405/sax-and-vb-6/)也讓我對如何將grandchilren標籤與現有屬性進行組合爲重命名的標籤創建一個更長的屬性。使用Sax解析在VB6中編輯和寫入XML

我有基本的框架設置(如鏈接網站所示)。我想我可能會將大部分繁重工作限制在兩個或三個子程序(_startDocument中的前四行,使用_startElement獲取描述標記,並將描述放入具有endElement的函數標記中)。然而我缺乏VB6/SAX的知識在這裏真的讓我受到傷害。任何幫助將不勝感激。

這裏是XML看起來像現在;

<errordetails> 
<error desc=」Count: 2」/> 
<error desc=」System: System X」/> 
<error desc=」Reason: Reason X」/> 
    <functions> 
     <function name=」x1」 Description=」y1」> 
     <violations count="2"> 
      <violation><source>admin</source><description>the first reason</description></violation> 
      <violation><source>admin</source><description>the second reason</description></violation> 
     </violations> 
     </function> 
     <function name=」x2」 Description=」y2」> 
     <violations count="1"> 
      <violation><source>admin</source><description>another reason</description></violation> 
     </violations> 
     </function> 
    </functions> 
</errordetails> 

這是我想要的xml看起來像;

<errordetails> 
<error desc=」Count: 2」/> 
<error desc=」System: System X」/> 
<error desc=」Reason: Reason X」/> 
<error desc=」FunctionName: x1, FunctionDescription: y1, FunctionReason: the first reason, FunctionReason: the second reason」/> 
<error desc=」FunctionName: x2, FunctionDescription: y2, FunctionReason: another reason"/> 
</errordetails> 

回答

2

您是否閱讀過舊文章The Joy of SAX: a Visual Basic Sample之類的東西?

很難告訴你更多。 SAX非常簡單,你只需要像處理狀態機一樣處理VB6 Form。這意味着您要編寫的大部分邏輯都會管理狀態,例如在通過事件向您提供轉換後的數據時進行累積和發送。

+0

謝謝。你給了我信心,這完全在我的能力範圍內。 – 2011-06-03 15:37:49

0

我忘了在我的問題中提到,如果一個函數的違規數量大於20,我只希望前20個描述爲FunctionReasons。 我在sax解析之外添加了前四行和最後一行。 我通過調用最後一個屬性'Get XMLDoc_Function()'來獲得另一個模塊中的輸出。 這是我得到的;

Option Explicit 

Implements IVBSAXContentHandler 

Dim m_oContentHandler As IVBSAXContentHandler 
Dim m_wtr_Function As MXXMLWriter40 
Dim m_oAttributes As MSXML2.SAXAttributes 
Dim m_DOM As MSXML2.DOMDocument40 

Dim m_sAttribute As String 
Dim m_sFunctionName As String 
Dim m_sFunctionDescription As String 
Dim m_sFunctionReason As String 
Dim m_sFunctionReasonCount As Integer 

Dim isDescription As Boolean 




Private Sub Class_Initialize() 
    Set m_wtr_Function = New MXXMLWriter40 
    m_wtr_Function.omitXMLDeclaration = True 
    Set m_oContentHandler = m_wtr_Function 
    Set m_DOM = New MSXML2.DOMDocument40 
    m_DOM.setProperty "SelectionLanguage", "XPath" 
    m_sFunctionReasonCount = 0 
End Sub 

Private Sub Class_Terminate() 
    Set m_wtr_Function = Nothing 
    Set m_oContentHandler = Nothing 
    Set m_oAttributes = Nothing 
    Set m_DOM = Nothing 
End Sub 

Private Sub IVBSAXContentHandler_characters(strChars As String) 
    If isDescription Then 
     If m_sFunctionReasonCount < 20 Then 
      m_sFunctionReason = ", FunctionReason: " & strChars 
      m_sAttribute = m_sAttribute & m_sFunctionReason 
      m_sFunctionReasonCount = m_sFunctionReasonCount + 1 
      isDescription = False 
     End If 
    End If 
End Sub 

Private Property Set IVBSAXContentHandler_documentLocator(ByVal RHS As MSXML2.IVBSAXLocator) 

End Property 

Private Sub IVBSAXContentHandler_endDocument() 

End Sub 

Private Sub IVBSAXContentHandler_endElement(strNamespaceURI As String, strLocalName As String, strQName As String) 

    Select Case strQName 
     Case "function" 
      m_oAttributes.addAttribute "", "desc", "desc", "xs:string", m_sAttribute 
      m_oContentHandler.startElement strNamespaceURI, "error", "error", m_oAttributes 
      m_oContentHandler.endElement strNamespaceURI, "error", "error" 
      m_sAttribute = "" 
      m_sFunctionReasonCount = 0 
    End Select 

End Sub 

Private Sub IVBSAXContentHandler_endPrefixMapping(strPrefix As String) 

End Sub 

Private Sub IVBSAXContentHandler_ignorableWhitespace(strChars As String) 

End Sub 

Private Sub IVBSAXContentHandler_processingInstruction(strTarget As String, strData As String) 

End Sub 

Private Sub IVBSAXContentHandler_skippedEntity(strName As String) 

End Sub 

Private Sub IVBSAXContentHandler_startDocument() 

    m_oContentHandler.startDocument 

End Sub 



Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As String, strLocalName As String, strQName As String, ByVal oAttributes As MSXML2.IVBSAXAttributes) 

    Select Case strQName 
     Case "functions" 
      'do nothing 

     Case "function" 
      Set m_oAttributes = New SAXAttributes40 
      m_sFunctionName = oAttributes.getValueFromQName("name") 
      m_sAttribute = "FunctionName: " & m_sFunctionName 
      m_sFunctionDescription = oAttributes.getValueFromQName("Description") 
      m_sAttribute = m_sAttribute & ", FunctionDescription: " & m_sFunctionDescription 

     Case "description" 
      isDescription = True 

    End Select 

End Sub 


Private Sub IVBSAXContentHandler_startPrefixMapping(strPrefix As String, strURI As String) 

End Sub 

Public Property Get XMLDoc_Function() As Variant 
    XMLDoc_Function = m_wtr_Function.output 
End Property