2016-04-06 2 views
0

VB6 на Win8.1 Microsoft XML v3.0VB6 DOMDocument найти конкретный комментарий и удалить

Я искал напрасно -I можно искать элементы в файле XML с помощью VB6, но я не могу понять, как искать для конкретного комментария в XML-файле и удалить его.

Я нашел отличный VB6 XML tutorial - некоторые примеры кода ниже, чтобы загрузить узлы в элементы управления TreeView/WebBrowser как пример типа кода я работаю с:

Private Sub cmdPopulate_Click() 
    Dim objPeopleRoot As IXMLDOMElement 
    Dim objPersonElement As IXMLDOMElement 
    Dim tvwRoot As Node 
    Dim X As IXMLDOMNodeList 

    Set m_objDOMPeople = New DOMDocument 

    'this can stop the m_objDOMPeople object from looking 
    'for external files which in our case are the people.dtd 
    'and the people.xsl files - set this to true if you want 
    'the parser to look for the external files 
    m_objDOMPeople.resolveExternals = True 

    'this can stop the m_m_objDOMPeople from validating the XML file 
    'against the people.dtd file - set this to true if you want validation to 
    'occur 
    m_objDOMPeople.validateOnParse = True 

    'load the XML into the dom document, using a string containing 
    'the XML location 
    m_objDOMPeople.async = False 
    Call m_objDOMPeople.Load(m_strXmlPath) 

    'check that the load of the XML document was successful 
    If m_objDOMPeople.parseError.reason <> "" Then 
    ' there has been an error with the loaded XML - show the reason 
    MsgBox m_objDOMPeople.parseError.reason 
    Exit Sub 
    End If 

    'get the root element of the XML - bypassing the comments, PI's etc 
    Set objPeopleRoot = m_objDOMPeople.documentElement 

    'Now lets populate the treecontrol from the DOMDocument 

    'Set Treeview control properties. 
    tvwPeople.LineStyle = tvwRootLines 
    tvwPeople.Style = tvwTreelinesPlusMinusText 
    tvwPeople.Indentation = 400 

    'check if the treeview has already been populated - if so 
    'remove the root, which removes everything. 
    If tvwPeople.Nodes.Count > 0 Then 
    tvwPeople.Nodes.Remove 1 
    End If 

    ' add a child to the root node of the TreeView 
    Set tvwRoot = tvwPeople.Nodes.Add() 
    tvwRoot.Text = objPeopleRoot.baseName 

    'iterate through each element in the dom to fill the tree, 
    'which in itself iterates through each childNode of that 
    'element(objPersonElement) to drill down into its childNodes 
    For Each objPersonElement In objPeopleRoot.childNodes 
    populateTreeWithChildren objPersonElement 
    Next 

    webTarget.Navigate m_strXmlPath 
    cmdDelete.Enabled = True 
    cmdClear.Enabled = True 
End Sub 

я нашел COMMENT_NODE - 8 на w3schools но я не знаю, как использовать это в VB6

заранее спасибо

EDIT: с помощью кода Боба

Я называю это следующим образом - это правильно? Он выполняет итерацию и, кажется, находит каждый .nodetype, но комментарии. Я совершенно уверен, что это ошибка оператора - если я неправильно вызываю DeleteTargetComments - передавая неправильный объект - что является правильным способом?

Private m_objDOMPeople As DOMDocument 

Private Sub cmdRemoveComments_Click() 

    ' DeleteTargetComments DOM.documentElement 

    Dim objPeopleRoot As IXMLDOMElement 

    Set objPeopleRoot = m_objDOMPeople.documentElement 

    DeleteTargetComments objPeopleRoot 
End Sub 
+0

Посмотрите, как XPATH используется в этом вопросе, http://stackoverflow.com/questions/8836590/vb6-select-a-single-node-using-xpath-with-backslashes-underscores – jac

+0

Jac, Thank вы для ответа - проверите его – beginAgain

+0

Это выглядит правильно, хотя и более «болтливое», чем требуется (нет необходимости в отдельно объявленной и заданной переменной). Я не уверен, почему это не сработает. – Bob77

ответ

0

Многие функции в MSXML действительно помогают оптимизировать использование на языке медленных скриптов. XPath является одним из них, и часто он получает вас очень мало, кроме сложности. Любое преимущество производительности, которое может иметься на очень длинных документах, срывается, избегая использования DOM вообще и просто переходя к синтаксическому анализу SAX.

Так что если вы имеете дело с довольно небольшими документами XML, программа VB6 может сделать это довольно просто.

Оригинальный XML:

<doc> 
    <item>a</item><!-- target to delete --> 
    <!-- to keep --> 
    <item>b<!-- target to delete too --></item> 
</doc> 

Вы можете просто использовать:

Private Sub DeleteTargetComments(ByRef Parent As MSXML2.IXMLDOMNode) 
    Dim Children As MSXML2.IXMLDOMNodeList 
    Dim Node As MSXML2.IXMLDOMNode 

    Set Children = Parent.childNodes 
    'We must check .length because in MSXML the collection iterators are broken: 
    If Children.length > 0 Then 
     For Each Node In Children 
      With Node 
       If .nodeType = NODE_COMMENT Then 
        If InStr(LCase$(.Text), "target") Then 
         Parent.removeChild Node 
        End If 
       Else 
        DeleteTargetComments Node 
       End If 
      End With 
     Next 
    End If 
End Sub 

и ссылаться на него как:

DeleteTargetComments DOM.documentElement 

Результат:

<doc> 
    <item>a</item><!-- to keep --> 
    <item>b</item> 
</doc> 

Довольно простая, хотя полная сохранность пробелов - еще одна тема.

+0

Bob77 - Спасибо, что ответишь - проверит это, все еще пытаясь найти нужный материал в vb6. Как и использование MSXML2 - как только я это сделаю, мне будет хорошо, я думаю. EDIT: Что я имею в виду - это выяснить, как ссылаться на MSXML2 - я знаю, что, возможно, я слишком усложняю ситуацию. – beginAgain

+0

Я не уверен, что вы просите. Вы можете установить ссылку на «Microsoft XML, v3.0' или« Microsoft XML, v6.0 »(оба работают, но не пытайтесь использовать какие-либо 4.0 или 5.0, которые вы видите устаревшими, и соответственно MS-Office). – Bob77

+0

Я понимаю - thx! – beginAgain

Смежные вопросы