2013-08-23 5 views
-1

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<!--IE2C Current Input--> 
<RSLogix5000Content SchemaRevision="1.0" SoftwareRevision="19.01" > 
<Controller Use="Context" Name="MAIN"> 
<AddOnInstructionDefinitions Use="Context"> 
<EncodedData EncryptionConfig="2"> 
<Description> 
<![CDATA[IE2C Current Input]]> 
</Description> 
<RevisionNote> 
<![CDATA[Initial Revision]]> 
</RevisionNote> 
zNti6YvCK0McoTr4NZK1iyGdEAkM0sxvRC35nnfg/Gd6x+f1lAbsW0PwA4f9TfqHs3MmOQ9OhS9...</EncodedData> 
</AddOnInstructionDefinitions> 
</Controller> 
</RSLogix5000Content> 

Я могу успешно возвращает значение EncryptionConfig (2), используя следующий код:

Dim xml As XPathDocument = New XPathDocument(filepath) 
xmlNav = xml.CreateNavigator() 
xmlNI = xmlNav.Select("//EncodedData") 
While (xmlNI.MoveNext()) 
    If IsNumeric(xmlNI.Current.GetAttribute("EncryptionConfig", "")) Then 
     encryptionconfig = xmlNI.Current.GetAttribute("EncryptionConfig", "") 
    Else 
     encryptionconfig = 0 
    End If 
End While 
xmlNI = Nothing 
xmlNav = Nothing 
xml = Nothing 

Проблема заключается в том, что мне также нужно вернуть только 'zNti6YvCK0McoTr4NZK1iyGdEAkM0 ... значение тоже. Все, что я пробовал до сих пор, возвращает его вместе со значениями Description и RevisionNote, которые я не хочу.

Update

Это окончательный код позволяет некодированные файлы и некоторые версиям файлов, которые не содержат атрибут EncryptionConfig:

Dim b64text As String = "" 
Dim encryptionconfig As Integer = 0 
Dim xml As XElement = XElement.Load(filepath) 
Dim node = xml.Descendants("EncodedData")(0) 
If node IsNot Nothing Then 
    b64text = node.Nodes().OfType(Of XText)().First().Value.Trim() 
    If node.Attribute("EncryptionConfig") IsNot Nothing Then 
     encryptionconfig = node.Attribute("EncryptionConfig").Value 
    End If 
Else 
    Label6.ForeColor = Color.Red 
    Label6.Text = "File is not encoded" 
End If 
node = Nothing 
xml = Nothing 
+0

Является ли это действительным XML? Часть «zNti6YvC ...» выглядит странно для меня. Это не атрибут и не ребенок? –

+0

Это фактически кодированный в формате base64 XML, который приложение добавляет в основной XML. Я предполагаю, что в этом отношении это недействительно, поэтому, вероятно, я испытываю трудности с извлечением этой строки, поскольку у нее нет имени атрибута. То, что я на самом деле пытаюсь сделать, это потянуть строку base64, расшифровать ее и вставить полученный XML обратно в основной файл XML. –

ответ

1

Вы должны проверить тип всех узлов <EncodedData> для текста. Простой способ будет использовать linq2xml, метод OfType и тип XText:

Пример:

Dim xml = <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
      <!--IE2C Current Input--> 
      <RSLogix5000Content SchemaRevision="1.0" SoftwareRevision="19.01" > 
      <Controller Use="Context" Name="MAIN"> 
      <AddOnInstructionDefinitions Use="Context"> 
      <EncodedData EncryptionConfig="2"> 
      <Description> 
      <![CDATA[IE2C Current Input]]> 
      </Description> 
      <RevisionNote> 
      <![CDATA[Initial Revision]]> 
      </RevisionNote> 
      zNti6YvCK0McoTr4NZK1iyGdEAkM0sxvRC35nnfg/Gd6x+f1lAbsW0PwA4f9TfqHs3MmOQ9OhS9...</EncodedData> 
      </AddOnInstructionDefinitions> 
      </Controller> 
      </RSLogix5000Content> 

Dim node = xml.Descendants("EncodedData")(0) 
Dim data = node.Nodes().OfType(Of XText)().First().Value.Trim() ' is zNti6YvCK0McoTr4NZK1iyGdEAkM0sxvRC35nnfg/Gd6x+f1lAbsW0PwA4f9TfqHs3MmOQ9OhS9... ' 
Dim config = node.Attribute("EncryptionConfig").Value ' is 2 '