【问题标题】:Using Sax parsing to edit and write XML in VB6在VB6中使用Sax解析编辑和编写XML
【发布时间】:2011-08-27 13:07:41
【问题描述】:

所以我试图在 VB6 中使用 SAX 解析来编辑一个 xml(输出是一个 xml)(对于一个古老的 COM 组件)。我更喜欢使用 DOM 解析,但 xml 的大小(可能超过 20MB)迫使我使用 SAX。我对 VB6 比较陌生,而且我在 SAX 解析方面没有经验。我在网上环顾四周,但即使是我找到的最好的资源 (http://www.developerfusion.com/article/84405/sax-and-vb-6/) 也让我对如何将孙子标签与现有属性结合起来知之甚少为重命名的标签创建一个更长的属性。

我有基本的框架设置(如链接网站所示)。我想我可能可以将大部分繁重的工作限制在两个或三个子过程中(_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>

【问题讨论】:

    标签: xml vb6 sax


    【解决方案1】:

    你读过类似旧文章The Joy of SAX: a Visual Basic Sample的东西吗?

    很难告诉你更多。 SAX 真的很简单,您只需要像对待任何 VB6 表单一样将其作为状态机来处理。这意味着您将编写的大部分逻辑都将管理状态,例如在通过事件提供给您时累积和发出转换后的数据。

    【讨论】:

    • 谢谢。你让我相信这完全在我的能力范围内。
    【解决方案2】:

    我忘了在我的问题中提到,如果一个函数的违规次数大于 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多