1 (изменено: alexii, 2011-11-02 18:26:59)

Тема: WSH: Поиск и извлечение текста из XML

Ребята. Вопрос.
Есть строка в XML файле :

<субъект идентификаторСубъекта="002-871-100318" типСубъекта="АбонентСЭД" имя="ООО 'Компенсатор'">

Как вытащить идентификатор субъекта и имя компании?
Имеется ввиду присвоить эти данные в какие нить переменные, откуда я потом их смогу использовать.

С самого начала идентификатор субъекта вытаскивал при помощи позиции символа:

Set objFSO= WScript.CreateObject("Scripting.FileSystemObject") 
  Set txtFile = objFSO.OpenTextFile("C:\XML\" & basename) 
  Do While Not txtFile.AtEndOfStream 
ReadLineTXT = txtFile.ReadLINE 
   If InStr(ReadLineTXT, "идентификаторСубъекта=""") Then 
     sNomer = mid(readlinetxt, 37, 14) 
wscript.echo sNomer 
      Exit Do 
    End If 
  Loop 
  txtFile.Close

А вот с компании стало потруднее, поскольку каждый раз имя компании по длине менялось.

Помогите пожалуйста.

P.S.
Сама XML с начала выглядит так:

<?xml version="1.0" encoding="Windows-1251"?> 
<регистрационнаяИнформация> 
<датаВремяФормирования>2011-10-31T15:49:58</датаВремяФормирования> 
<списокСубъектов> 
<субъект идентификаторСубъекта="002-871-100318" типСубъекта="АбонентСЭД" имя="ООО 'Компенсатор'"> 
<списокСертификатов типПодписанта="руководитель"> 
<сертификат активный="true">

2

Re: WSH: Поиск и извлечение текста из XML

Хм... ну т.к Вы привели не полное содержимое XML, то мне пришлось догадываться о том где закрываются тэги.

В итоге предположил, что так


<?xml version="1.0" encoding="Windows-1251"?> 
<регистрационнаяИнформация> 
<датаВремяФормирования>2011-10-31T15:49:58</датаВремяФормирования> 
<списокСубъектов> 
<субъект идентификаторСубъекта="002-871-100318" типСубъекта="АбонентСЭД" имя="ООО 'Компенсатор'">
<списокСертификатов типПодписанта="руководитель"> 
<сертификат активный="true">
</сертификат>
</списокСертификатов>
</субъект>
</списокСубъектов>
</регистрационнаяИнформация>

В кратце можно дёрнуть как то так наверное.


Option Explicit
Dim DOMDocument, Node, tmpStr
Set DOMDocument = CreateObject("MSXML2.DOMDocument")
With DOMDocument
	.Load "1.xml"
	if .parseError.reason <> "" Then
	    MsgBox .parseError.reason,vbCritical
	    WScript.Quit
	End if
	With .documentElement.SelectSingleNode("списокСубъектов")
        tmpStr = ""
        For Each Node in .SelectNodes("субъект")
            tmpStr = tmpStr & "Идентификатор субъекта: " & Node.GetAttribute("идентификаторСубъекта") & vbCrlf
            tmpStr = tmpStr & "Тип субъекта: " & Node.GetAttribute("идентификаторСубъекта") & vbCrlf
            tmpStr = tmpStr & "имя: " & Node.GetAttribute("имя") & vbCrlf
            MsgBox tmpStr
        Next
    End With
End With
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3

Re: WSH: Поиск и извлечение текста из XML

Любую задачу можно решить несколькими путями. Вариации на тему решения Xameleon

1


Option Explicit

Dim DOMDocument, Subjs, Subj, I, tmpStr
Set DOMDocument = CreateObject("MSXML2.DOMDocument")

With DOMDocument
    .Load "1.xml"
    if .parseError.reason <> "" Then
        MsgBox .parseError.reason,vbCritical
        WScript.Quit
    End if

    Set Subjs = .GetElementsByTagName("субъект")

    For I = 0 To Subjs.Length - 1
        tmpStr = ""
        tmpStr = tmpStr & "Идентификатор субъекта: " & Subjs(I).GetAttribute("идентификаторСубъекта") & vbCrlf
        tmpStr = tmpStr & "Тип субъекта: " & Subjs(I).GetAttribute("типСубъекта") & vbCrlf
        tmpStr = tmpStr & "имя: " & Subjs(I).GetAttribute("имя") & vbCrlf
        WScript.Echo tmpStr
    Next
End With

2


Option Explicit

Dim DOMDocument, Subjs, Subj, I, tmpStr
Set DOMDocument = CreateObject("MSXML2.DOMDocument")

With DOMDocument
    .Load "1.xml"
    if .parseError.reason <> "" Then
        MsgBox .parseError.reason,vbCritical
        WScript.Quit
    End if

    Set Subjs = .GetElementsByTagName("субъект")

    For Each Subj In Subjs
        tmpStr = ""
        tmpStr = tmpStr & "Идентификатор субъекта: " & Subj.GetAttribute("идентификаторСубъекта") & vbCrlf
        tmpStr = tmpStr & "Тип субъекта: " & Subj.GetAttribute("типСубъекта") & vbCrlf
        tmpStr = tmpStr & "имя: " & Subj.GetAttribute("имя") & vbCrlf
        WScript.Echo tmpStr
    Next
( 2 * b ) || ! ( 2 * b )

4

Re: WSH: Поиск и извлечение текста из XML

Благодарю. Вот что получилось у меня. Но есть вопрос:

Dim DOMDocument, Node, tmpStr 
Set DOMDocument = CreateObject("MSXML2.DOMDocument") 
With DOMDocument 
    .Load "C:\XML\" & basename 
    if .parseError.reason <> "" Then 
        MsgBox .parseError.reason,vbCritical 

        WScript.Quit 

    End if 
    With .documentElement.SelectSingleNode("списокСубъектов") 
        tmpStr = "" 
        For Each Node in .SelectNodes("субъект") 
            sNomer = Node.GetAttribute("идентификаторСубъекта") 
             firm = Node.GetAttribute("имя")           
    MsgBox sNomer 
   MsgBox firm 
  Next 
 End With 
End With

В поле имя иногда могут быть кавычки. А мне надо, что там были только буквы безо всяких кавычек.
Как мне сделать замену символов(коротко - удалить):
'
"
»
«

5

Re: WSH: Поиск и извлечение текста из XML

Ну если замен не очень много, то можно и обычным Replace() обойтись.

А если нужно отсеить только разрешённые символы, то наверное и так можно:


Const ValidChars = "0123456789abcdefghijklmnopqrstuvwxyz абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
'Без учёта регистра
MsgBox GetOnlyValidChars("Фирма ООО ЗАО ""ХРЕНТУДЫСЬ"" ###", ValidChars, 1)
'С учётом регистра
MsgBox GetOnlyValidChars("фирма ООО ЗАО ""ХРЕНТУДЫСЬ"" ###", ValidChars, 0)

Function GetOnlyValidChars(sString, ValidChars, Compare)
    Dim i, char
    For i = 1 To Len(sString)
        char = Mid(sString, i, 1)
        If InStr(1, ValidChars, char, Compare) > 0 Then GetOnlyValidChars = GetOnlyValidChars & char
    Next
End Function
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

6

Re: WSH: Поиск и извлечение текста из XML

Разобрался. Спасибо. Сделал вот так :


firm = Replace(firm,"'","")
firm = Replace(firm,"""", "")
firm = Replace(firm,"»", "")
firm = Replace(firm,"«", "")

Корректировка не нужна?