2014-01-16 3 views
0

Я пишу ASP-классическую страницу с помощью VBScript, и всякий раз, когда возникает ошибка записи в базу данных Oracle, я хочу написать xml-файл и сохранить его в каталоге на веб-сервере ,VBScript xmlDoc.save не работает

Вот что у меня есть:

Sub writeError(error) 
    text="<xml>" 
    text = text & vbCrLf &"<username>"&currentUser&"</username>" 
    text=text & vbCrLf & "<date>"&Now&"</date>" 
    text=text & vbCrLf & "<error>"&error&"</error>" 
    text=text & vbCrLf & "<xml>"  

    set xmlDoc=Server.CreateObject("Microsoft.XMLDOM") 
    xmlDoc.async=false 
    xmlDoc.loadXML(text) 
    xmlDoc.Save((Server.MapPath("xml/Error.xml"))) 
End sub 

Это берет имя пользователя, текущее время, и сообщение об ошибке, и предполагается записать его в файл. Раньше я использовал почти ту же самую функцию, и она работала нормально, поэтому я не уверен, что здесь происходит. Есть идеи?

+0

Я понял, в чем была моя проблема.Да, это был закрывающий тег xml, и это было также потому, что у меня был '
', добавленный в конец' error', и поэтому '
' все это отбрасывал. Спасибо за помощь! –

ответ

1

Как G. Stoynev уже подозревал, что вы получаете эту ошибку, потому что вы положили другое отверстие <xml> тег в конце строки:

<xml> 
<username>jbrown</username> 
<date>01/13/2014 15:42:23</date> 
<error>Your error message.</error> 
<xml>

Он должен был закрывающая бирка (</xml>):

<xml> 
<username>jbrown</username> 
<date>01/13/2014 15:42:23</date> 
<error>Your error message.</error> 
</xml>

Вы можете обнаружить ошибки, как это, проверяя ParseError свойство:

If xmlDoc.ParseError <> 0 Then 
    MsgBox xmlDoc.ParseError.Reason 
End If 

, которые бы дали вам следующее сообщение:

Следующие теги не были закрыты: XML, XML.

Я бы не рекомендую просто написать строку XML в файл, хотя, потому что путь недействительный XML будет оставаться незамеченными, пока кто пытается работать с файлом. Не создавайте XML путем конкатенации строк, а используйте вместо этого соответствующие методы.

Set rootNode = xmlDoc.CreateElement("xml") 

Set userNode = xmlDoc.CreateElement("username") 
userNode.text = currentUser 
rootNode.AppendChild userNode 

Set dateNode = xmlDoc.CreateElement("date") 
dateNode.text = Now 
rootNode.AppendChild dateNode 

Set errorNode = xmlDoc.CreateElement("error") 
errorNode.text = error 
rootNode.AppendChild errorNode 

xmlDoc.Save Server.MapPath("xml/Error.xml") 

Вы могли бы упростить, что немного, окружив создание дочернего узла в функции:

Function NewNode(name, value) 
    Set node = xmlDoc.CreateElement(name) 
    node.text = value 
    Set NewNode = node 
End Function 

Set rootNode = xmlDoc.CreateElement("xml") 

rootNode.AppendChild NewNode("user", currentUser) 
rootNode.AppendChild NewNode("date", Now) 
rootNode.AppendChild NewNode("error", error) 

xmlDoc.Save Server.MapPath("xml/Error.xml") 

На другой ноте я хотел бы предложить две другие модификации:

  1. Microsoft.XMLDOM устарел. Вместо этого используйте Msxml2.DOMDocument.6.0.
  2. Удалить лишние скобки. В отличие от других языков сценариев VBScript не всегда требует наличия списков аргументов в круглых скобках. Прочитайте this article о многих, разных значениях круглых скобок в VBScript (и интересных ситуациях, которые могут возникнуть).
+0

Спасибо за отличный совет. Как ни странно, это все еще не записывает файл. Я не могу понять, почему он не будет писать, хотя –

+0

Кажется, что он застрял в строке Set rootNode. Я положил response.write сразу после него, и ничего не отображается. –

+0

Получил это. Существовал '
', добавленный к концу' error', и это не понравилось. Ваш xmlDoc.ParseError помог мне решить эту проблему, поэтому я дам вам правильный ответ. Также мне нравится, как вы показывали дочерние узлы. –

2

Возможно, это ваш закрывающий тег xml.

Вы также можете использовать FSO для записи в виде текстового файла вместо использования XML activeX.

Нечто подобное

outFile="xml/Error.xml" 
Set objFile = objFSO.CreateTextFile(outFile,True) 
objFile.WriteLine "<xml>" 
... 
objFile.Close 
+0

+1 для указания ошибки. Однако я бы не ** рекомендовал писать текстовые XML-строки вручную в текстовые файлы. Это будет только задерживать обнаружение ошибок, подобных тому, что сделал OP. –

+0

Спасибо за комментарий! Я попробовал это, и он все еще не работает. Мне просто нужно просто написать , чтобы увидеть, напишет ли файл, и ничего не происходит. –

+0

Я верю, что он висит на линии set objFile. Я положил response.write сразу после него, и ничего не происходит. –

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