2009-09-08 3 views
0

J'ai des ennuis avec XMLTextWriter.WriteStartElement lancer une exception:XmlTextWriter répond par System.InvalidOperationException lors de la création de deuxième élément

System.InvalidOperationException 

en essayant d'écrire le deuxième élément dans mon document XML.
Cette erreur est de nouveau "The Writer is closed". Je ne l'ai pas fermé, donc je devine qu'il est tombé hors de la portée ??
J'ai créé une classe pour écrire un fichier XML en utilisant XMLTextWriter en tant qu'objet dans ma classe. Voici le code pertinent. J'ai trouvé un autre poste sur codeguru qui n'a jamais été répondu avec exactement le même problème. Toute idée de solution de contournement ou autre serait appréciée.

Function CreateXML()... 
Try 
      _listDocument = New XmlTextWriter(_xmlDI.FullName & "\\" & currentFilename, Nothing) 
      CreateHeader() 
      AddTimeDateNode() 
      CreateXML = True 
     Catch xmlErr As XmlException 
      MsgBox("Unable to create temporary file(" & currentFilename & ") that is used to change your whitelist or blacklist. " & _ 
        "More technical information: " & xmlErr.Message, MsgBoxStyle.Critical, "Can't Continue") 
     End Try 
    End Function 

Function AddListMember(ByVal listType As String, ByVal listItem As String, ByVal action As String) As Boolean 
    _listDocument.WriteStartElement(listItem) <-- CODE THROWS EXCEPTION HERE! 
    _listDocument.WriteAttributeString("listType", listType) 
    _listDocument.WriteAttributeString("action", action) 
    _listDocument.WriteString(listItem) 
    _listDocument.WriteEndElement() 
    _listDocument.WriteWhitespace(Chr(13) & Chr(10) & "\t") 
    Return True 
End Function 

'Sets the XML header 
Private Function CreateHeader() As Boolean 
    _listDocument.WriteStartDocument(False) 
    _listDocument.WriteWhitespace(Chr(13) & Chr(10)) 
    Return True 
End Function 

'Add Time Date node 
Private Function AddTimeDateNode() As Boolean 
    _listDocument.WriteStartElement("DateTimeAdded") 
    _listDocument.WriteString(DateTime.Now.ToString) 
    _listDocument.WriteEndElement() 
    _listDocument.WriteWhitespace(Chr(13) & Chr(10)) 
    Return True 
End Function 

J'appelle ces fonctions après l'instanciation d'une dimension de ListXML (le nom de ma classe) avec le code suivant:

Dim xmloutput As New ListXML 

xmloutput.CreateXML() 
xmloutput.AddListMember(xmloutput.ReturnWhiteList, currentItem.SenderEmailAddress, xmloutput.ReturnAddAction) 

Répondre

1

Pour autant que je peux dire, il semble que vous êtes essayer de créer plus d'un élément racine - un pour DateTimeAdded et un pour votre membre de la liste.

Si vous appelez WriteStartElement dans CreateXml() vous obtiendrez un code XML valide. Vous devrez terminer cet élément avant de terminer le document, bien sûr.

(Et oui, le poste de codeguru ressemble il essaie de faire la même chose.)

Fondamentalement, ceci est un document XML valide:

<RootElement> 
    <FirstElement> 
    Content 
    </FirstElement> 
    <SecondElement> 
    Content 
    </SecondElement> 
</RootElement> 

Mais ce n'est pas:

<FirstElement> 
    Content 
</FirstElement> 
<SecondElement> 
    Content 
</SecondElement> 

Vous essayiez de faire le dernier, d'où le problème.

+0

Merci Jon! C'était le problème. –

Questions connexes