Использовать Get Entity Nodes из SGM файла - PullRequest
0 голосов
/ 01 апреля 2020

Я использую VB. Net, чтобы прочитать файл SGM и добавить элементы <!Entity> в список. Я пытался использовать объект XmlNodeType, но это не работает

xml

<!DOCTYPE dmodule[
<!ENTITY Name_1 SYSTEM "Illustrations\_StdDay.wmf" NDATA wmf>
<!ENTITY Name_2 SYSTEM "Illustrations\SA50.wmf" NDATA wmf>
<!ENTITY Name_3 SYSTEM "Illustrations\a3-3.wmf" NDATA wmf>
<!ENTITY Name_4 SYSTEM "Illustrations\pb0318.wmf" NDATA wmf>
<!NOTATION wmf SYSTEM "wmf">
<!NOTATION jpg SYSTEM "jpg">
<!NOTATION png SYSTEM "png">
<!NOTATION vsd SYSTEM "vsd"> ]>
<docfm paranumbers="1">
  <front numcols="2">
    <idinfo>
    </idinfo>
  </front>
</docfm>

код

Private Sub btnTest_Click(sender As Object, e As EventArgs) Handles btnTest.Click
    Dim xmlReader As New XmlTextReader("C:\Test\Burst\sample.sgm")
    While xmlReader.Read()
        Select Case xmlReader.NodeType
            Case XmlNodeType.Entity
                ListBox1.Items.Add(xmlReader.Name)
                Debug.WriteLine("Entity: " + xmlReader.Name)
                Exit Select
            Case XmlNodeType.Element
                ListBox1.Items.Add("<" + xmlReader.Name & ">")
                Debug.WriteLine("Element: " + xmlReader.Name)
                Exit Select
            Case XmlNodeType.Text
                ListBox1.Items.Add(xmlReader.Value)
                Debug.WriteLine("Text: " + xmlReader.Name)
                Exit Select
        End Select
    End While
End Sub

1 Ответ

0 голосов
/ 01 апреля 2020

Использование Xml Linq. Обратите внимание на квадратные скобки в вашем xml.

mports System.Xml
Imports System.Xml.Linq
Imports System.Text.RegularExpressions
Imports System.IO
Module Module1
    Const FILENAME As String = "c:\temp\test.xml"
    Sub Main()
        Dim doc As XDocument = XDocument.Load(FILENAME)
        Dim pattern As String = "\<!ENTITY(?'text'[^\>]+)"
        Dim cdata As List(Of XDocumentType) = doc.DescendantNodes().Where(Function(x) x.NodeType = XmlNodeType.DocumentType).Select(Function(x) CType(x, XDocumentType)).ToList()
        Dim subsets As List(Of String) = cdata.Select(Function(x) x.InternalSubset).ToList()
        For Each subset As String In subsets
            Dim reader As New StringReader(subset)
            Dim item As String = ""
            While True
                item = reader.ReadLine()
                If item Is Nothing Then
                    Exit While
                End If
                If item.Length > 0 Then
                    item = item.Trim()
                    Dim match As Match = Regex.Match(item, pattern)
                    Dim seperators() As Char = {" "c}
                    Dim items As List(Of String) = match.Groups("text").Value.Trim().Split(seperators).ToList()
                    Console.WriteLine(String.Join(",", items))
                End If

            End While

        Next subset
        Console.ReadLine()
    End Sub

End Module
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...