Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Помогите распарсить XML (не полностью) / 11 сообщений из 11, страница 1 из 1
28.06.2018, 15:52
    #39667234
Помогите распарсить XML (не полностью)
Всем привет.
Помогите с парсингом файлов, стандартный импорт XML не прокатил. :(
В определенной папке складываю прилетающие файлы *.xml (см. аттач)
Из них нужны сегменты:
managedObject class="SBTS"
managedObject class="MPLANE"
И еще одна из строк комментария типа <!-- WBTSID=149 WBTS_IP=10.142.131.156 RNCNAME=NRNC2KRD -->.(Она может быть не во всех файлах и это нормально)

В результате хотелось бы получить три таблицы
В таблице SBTS нужны NumBS(берем из имени файла после второго нижнего подчеркивания), distName="SBTS-607782" и <p name="sbtsName">KdK_Armavir_Lenina_2</p>
NumBSSBTSsbtsName60778607782KdK_Armavir_Lenina_2.........

В таблице MPLANE нужны NumBS,SBTS и значение IP-адреса <p name="mPlaneIpAddress">10.159.210.148</p>
NumBSSBTSmPlaneIpAddress6077860778210.159.210.148.........

И третья, назовем ее WBTS:с полями NumBS, SBTS, WBTSID, WBTS_IP и RNCNAME

NumBSSBTSWBTSIDWBTS_IPRNCNAME6077860778214910.142.131.156NRNC2KRD...............
П.С. Устал руками вытаскивать эти данные. :(
...
Рейтинг: 0 / 0
28.06.2018, 21:16
    #39667387
DarkMan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите распарсить XML (не полностью)
Архимедофф, Я не работал с файлами , так как я не волшебник , а только учусь . Но я попробовал быстренько поиграться с PHP . На скорую руку получилось пробежаться по массиву , и получить в цикле значения и имя name аттрибута <p> . Но еще лучше я думаю , это использовать JavaScript и jQuery , так как они работают на клиенте и с их помощью можно более детально отобрать необходимые элементы страницы . Ну , а далее все данные можно загнать например на MySQL или SQL Server (правда я не пробовал в связке PHP SQL Server )
Ну если интерессно , то на PHP у меня получилось такое .
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?php
$content=file_get_contents('Commision_File2.XML');
$rss=new SimpleXMLElement($content);
$i=0;
  foreach($rss as $rss){
	foreach($rss->managedObject as $item){
		for($i = 0; $i < count($item); $i++){
			echo $item->p[$i]['name'] . ' &nbsp;&nbsp; '. $item->p[$i] . '<br>';
		}
	}
}
?>


P.S Если Вам очень срочно , то обратитесь в подфорумы PHP , JavaScript . Они там быстро разберутся , а если нет , то на выходных я попробую побаловаться, так как со временем проблемы. А может и аксессники что нибудь подскажут. Но как на чистом Access и VBA сделать , я не знаю .
...
Рейтинг: 0 / 0
28.06.2018, 21:45
    #39667399
DarkMan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите распарсить XML (не полностью)
Архимедофф,
Ну в принципе можно обработать массив и на PHP , получается примерно такое. Толькло вот как все это загнать в базу Access я не знаю, нужно гуглить. Самый простой вариант MySQL . Вот как то так .
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 <?php
$content=file_get_contents('Commision_File2.XML');
$rss=new SimpleXMLElement($content);
foreach($rss as $rss){
 foreach($rss->managedObject as $item){
  for($i = 0; $i < count($item); $i++){
   echo $item['class'] . '----' . $item['distName'] . '----' . $item->p[$i]['name'] . ' --- '. $item->p[$i] . '<br>';
		}
	}
}
?>


Результат получается примерно такой.
...
Рейтинг: 0 / 0
28.06.2018, 21:52
    #39667403
DarkMan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите распарсить XML (не полностью)
Архимедофф, Пока самый простой вариант загнать всю эту беду в базу MySQL, a затем из Access коннектиться. Или обрабатывать в MySQL . Как то так наверное .
...
Рейтинг: 0 / 0
28.06.2018, 23:58
    #39667428
Помогите распарсить XML (не полностью)
DarkMan, пока вот так получается вытащить данные. Но дело в том что части данных нет в том или ином файле.
Теперь не знаю как обойти ошибки не найденных данных. Использовать On Error Resume Next вроде как не правильно, иначе в дальнейшем коде не увижу ошибку :(

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    i = FreeFile
    Open FP For Input As i: sPat = Input(LOF(i), i): Close i
    sText = sPat
    
    'On Error Resume Next
    
    OAMIP = Split(Split(sPat, "mPlaneIpAddress" & Chr(34) & ">")(1), "<")(0)
    SBTSID = Split(Split(sPat, "SBTS-")(1), Chr(34))(0)
    btsName = Split(Split(sPat, "btsName" & Chr(34) & ">")(1), "<")(0)
    BCFID = Split(Split(sPat, "bcfid" & Chr(34) & ">")(1), "<")(0)
    WBTSID = Split(Split(sPat, "<!-- WBTSID=")(1), " ")(0)
    RNCNAME = Split(Split(sPat, "RNCNAME=")(1), "-->")(0)
    MRBTSID = Split(Split(sPat, "MRBTS-")(1), Chr(34))(0)
    LNBTSID = Split(Split(sPat, "/LNBTS-")(1), Chr(34))(0)
...
Рейтинг: 0 / 0
29.06.2018, 08:25
    #39667475
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите распарсить XML (не полностью)
Архимедофф,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
Sub p_xml()
Dim strFileName As String, strNumBS As String, strSBTS As String
Dim objXmlDoc As Object ' MSXML2.DOMDocument
Dim objXmlSingleNode As Object 'MSXML2.IXMLDOMNode

On Error GoTo HandleErrors

strFileName = GetFileName
    If Len(strFileName) = 0 Then Exit Sub
    If Len(Dir$(strFileName)) = 0 Then Exit Sub
strNumBS = Split(Dir$(strFileName), "_")(2)
Set objXmlDoc = CreateObject("MSXML2.DOMDocument")

    With objXmlDoc
        .async = False
            If Not .Load(strFileName) Then
                MsgBox "Oops!!", vbCritical
                GoTo ExitHere
            End If
        Set objXmlSingleNode = .selectSingleNode("/raml/cmData/managedObject[@class='SBTS']")
    End With
    If Not objXmlSingleNode Is Nothing Then
        With objXmlSingleNode
            '&#242;&#224;&#225;&#235;&#232;&#246;&#224; SBTS
            Debug.Print strNumBS
            strSBTS = Mid(.Attributes.getNamedItem("distName").Text, 6)
            Debug.Print strSBTS
            Debug.Print .selectSingleNode("p[@name='sbtsName']").Text
        End With
    End If
Set objXmlSingleNode = objXmlDoc.selectSingleNode("/raml/cmData/managedObject[@class='MPLANE']")
    If Not objXmlSingleNode Is Nothing Then
        With objXmlSingleNode
            '&#242;&#224;&#225;&#235;&#232;&#246;&#224; MPLANE
            Debug.Print strNumBS
            Debug.Print strSBTS
            Debug.Print .selectSingleNode("p[@name='mPlaneIpAddress']").Text
        End With
    End If
ExitHere:
    Set objXmlDoc = Nothing
    Exit Sub
HandleErrors:
    Debug.Print Err.Number; vbTab; Err.Description
    Resume ExitHere
End Sub

Private Function GetFileName(Optional ByVal strPath As String) As String
On Error Resume Next
    If Len(strPath) = 0 Then strPath = CurrentProject.Path
    If Len(Dir$(strPath, vbDirectory)) = 0 Then strPath = CurrentProject.Path
    With Application.FileDialog(1&)
        .InitialFileName = strPath
        .AllowMultiSelect = False
        .Title = "&#211;&#234;&#224;&#230;&#232;&#242;&#229; &#244;&#224;&#233;&#235;"
        .Filters.Clear
        .Filters.Add "eXtensible Markup Language", "*.xml", 1
        .FilterIndex = 1
            If .Show = -1 Then
                GetFileName = .SelectedItems(1)
            End If
    End With
End Function

...
Рейтинг: 0 / 0
29.06.2018, 09:45
    #39667493
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите распарсить XML (не полностью)
АрхимедоффИ еще одна из строк комментария типа <!-- WBTSID=149 WBTS_IP=10.142.131.156 RNCNAME=NRNC2KRD -->.(Она может быть не во всех файлах и это нормально)Из какого узла нужен этот коммент?
Вот так можно получить все комментарии в файле:
Код: vbnet
1.
2.
3.
    For Each objXmlComment In objXmlDoc.selectNodes("//comment()")
        Debug.Print objXmlComment.nodeValue
    Next


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 SITE_ID = 25023100155 
#oamip
 START TEXT_topip2 
 STOP TEXT_topip2 
#umtsip
#umtsip
#umtsip
#umtsip
#oamip
#umtsip
#umtsip
#umtsip
 WBTSID=149 WBTS_IP=10.142.131.156  RNCNAME=NRNC2KRD 
#umtsip
 TEXT_alarm tipe_6 
...
Рейтинг: 0 / 0
24.09.2018, 23:07
    #39707336
Помогите распарсить XML (не полностью)
Панург, попытался добавить в ваш немного своего. Выделил цветом. Возвращается только одно значение. А если значений несколько, как по этим объектам(/raml/cmData/managedObject[@class='LNCEL') пройтись в цикле?
Или может есть прямая ссылка на объект, типа raml/cmData/managedObject[@class='LNCEL']/p[@name='earfcnUL'] ?
И как добраться до объектов, как на скрине?


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
Sub p_xml()
Dim strFileName As String, strNumBS As String, strSBTS As String
Dim objXmlDoc As Object ' MSXML2.DOMDocument
Dim objXmlSingleNode As Object 'MSXML2.IXMLDOMNode

On Error GoTo HandleErrors

strFileName = GetFileName
    If Len(strFileName) = 0 Then Exit Sub
    If Len(Dir$(strFileName)) = 0 Then Exit Sub
strNumBS = Split(Dir$(strFileName), "_")(2)
Set objXmlDoc = CreateObject("MSXML2.DOMDocument")

    With objXmlDoc
        .async = False
            If Not .Load(strFileName) Then
                MsgBox "Oops!!", vbCritical
                GoTo ExitHere
            End If
        Set objXmlSingleNode = .selectSingleNode("/raml/cmData/managedObject[@class='SBTS']")
    End With
    If Not objXmlSingleNode Is Nothing Then
        With objXmlSingleNode
            '&#242;&#224;&#225;&#235;&#232;&#246;&#224; SBTS
            Debug.Print strNumBS
            strSBTS = Mid(.Attributes.getNamedItem("distName").Text, 6)
            Debug.Print strSBTS
            Debug.Print .selectSingleNode("p[@name='sbtsName']").Text
        End With
    End If
Set objXmlSingleNode = objXmlDoc.selectSingleNode("/raml/cmData/managedObject[@class='MPLANE']")
    If Not objXmlSingleNode Is Nothing Then
        With objXmlSingleNode
            '&#242;&#224;&#225;&#235;&#232;&#246;&#224; MPLANE
            Debug.Print strNumBS
            Debug.Print strSBTS
            Debug.Print .selectSingleNode("p[@name='mPlaneIpAddress']").Text
        End With
    End If

 Set objXmlSingleNode = objXmlDoc.SelectSingleNode("/raml/cmData/managedObject[@class='LNCEL']")
    If Not objXmlSingleNode Is Nothing Then
        With objXmlSingleNode
            Debug.Print .SelectSingleNode("p[@name='earfcnUL']").Text
        End With
    End If


ExitHere:
    Set objXmlDoc = Nothing
    Exit Sub
HandleErrors:
    Debug.Print Err.Number; vbTab; Err.Description
    Resume ExitHere
End Sub


...
Рейтинг: 0 / 0
25.09.2018, 05:57
    #39707375
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите распарсить XML (не полностью)
АрхимедоффИ как добраться до объектов, как на скрине?
Код: vbnet
1.
2.
3.
4.
5.
6.
Set objXmlSingleNode = objXmlDoc.selectSingleNode("/raml/cmData/managedObject[@class='LNCEL']/list[@name='acBarOc']/item")
    If Not objXmlSingleNode Is Nothing Then
        For Each objXmlSingleNode In objXmlSingleNode.selectNodes("*")
            Debug.Print objXmlSingleNode.Attributes(0).Text; vbTab; objXmlSingleNode.Text
        Next
    End If
...
Рейтинг: 0 / 0
25.09.2018, 09:33
    #39707454
Помогите распарсить XML (не полностью)
Панург,

Спасибо вам за помощь огромное.
Ну и наверное последний вопрос в этой теме. Объектов /raml/cmData/managedObject[@class='LNCEL'] или других может быть несколько. Попытался в начале "/raml/cmData/managedObject[@class='SBTS']" заменить на "/raml/cmData", но не получил ни чего
Как получить?
...
Рейтинг: 0 / 0
25.09.2018, 09:40
    #39707464
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите распарсить XML (не полностью)
АрхимедоффКак получить?

Например так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim objXmlNode As Object, objXmlChildNode As Object 'MSXML2.IXMLDOMNode
    For Each objXmlNode In objXmlDoc.selectNodes("/raml/cmData/managedObject[@class='LNCEL']/*")
        If objXmlNode.Attributes(0).Text = "acBarOc" Then
            For Each objXmlChildNode In objXmlNode.selectNodes("item/*")
                Debug.Print objXmlChildNode.Attributes(0).Text; vbTab; objXmlChildNode.Text
            Next
        Else
            Debug.Print objXmlNode.Attributes(0).Text; vbTab; objXmlNode.Text
        End If
    Next
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Помогите распарсить XML (не полностью) / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]