Правильный способ написать и прочитать строку XML - PullRequest
2 голосов
/ 05 ноября 2008

Я уже довольно долго бьюсь головой об эту стену, поэтому я решил спросить некоторых экспертов.

Мне нужно отправить строку xml с одного компьютера на другой. Я хотел бы отформатировать XML примерно так:

<xml>
  <author>Joe the Magnificent</author>
  <title>Joe Goes Home</title>
</xml>

Может ли кто-нибудь оказать некоторую помощь?

Редактировать: Подробнее

Я контролирую как отправку, так и получение, и успешно передал жестко закодированную строку в одну сторону.

Вот приемная сторона:

    Dim author As String
    Dim title As String

    Dim xDoc As New XmlDocument
    Dim xAuthor As XmlElement
    Dim xTitle As XmlElement

    xDoc.LoadXml(xml)
    xAuthor = xDoc.FirstChild.Item("author")
    xTitle = xDoc.FirstChild.Item("title")

    author = xAuthor.FirstChild.Value
    title = xTitle.FirstChild.Value

    ShowMessage(author, title)

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

Ответы [ 4 ]

4 голосов
/ 05 ноября 2008

Используя метод XmlDocument.Load , у вас есть 4 варианта: из Stream, TextReader, URL или XmlReader.

Вы можете использовать класс NetworkStream для работы по сети. Вы можете разместить свой XML на веб-сайте и сосать его с помощью опции URL. Возможно, вы захотите более подробно рассказать о протоколе, в котором вы хотите, чтобы произошла передача.

Например, для записи в поток используйте перегрузку XmlWriter.Create для потока. Используйте объект XmlWriterSettings для предоставления отступов.

   Dim settings As XmlWriterSettings = New XmlWriterSettings()
   settings.Indent = true
   settings.IndentChars = (ControlChars.Tab)
   settings.OmitXmlDeclaration = true

   Dim myNetworkStream As New NetworkStream(mySocket) 'mySocket is a whole other code sample

   ' Create the XmlWriter object and write some content.
   writer = XmlWriter.Create(myNetworkStream, settings)
   XmlDocument.WriteTo(writer)

Создание XML-документов [по старинке] было довольно громоздким, и я бы посоветовал взглянуть на литералы VB9 XML. Однако вот пример манипуляции XmlDocument в стиле .NET 2:

    Dim doc As New XmlDocument()
    Dim root As XmlElement = doc.CreateElement("xml")
    Dim author As XmlElement = doc.CreateElement("author")
    author.Value = "Joe the magnificent"
    Dim title As XmlElement = doc.CreateElement("title")
    title.Value = "Joe goes home"

    root.AppendChild(author)
    root.AppendChild(title)
    doc.AppendChild(root)
3 голосов
/ 12 ноября 2008

Вот что я в итоге сделал:

Public Function FormatMessage(ByVal author As String, ByVal title As String, ByVal genre As String) As String
Dim xDoc As New XmlDocument

' Create outer XML
Dim xNode As XmlNode = xDoc.AppendChild(xDoc.CreateElement("xml"))

' Create Author Node
Dim xAuthor As XmlNode = xNode.AppendChild(xDoc.CreateElement("author"))
xAuthor.InnerText = author

' Create Message Node
Dim xTitle As XmlNode = xNode.AppendChild(xDoc.CreateElement("message"))
xtitle.InnerText = title

' Create Genre Node
Dim xGenre As XmlNode = xNode.AppendChild(xDoc.CreateElement("genre"))
xGenre.InnerText = genre

' Create StringWriter to convert XMLDoc to string
Dim xWriter As New IO.StringWriter()
Dim xml_writer As New XmlTextWriter(xWriter)
xDoc.WriteContentTo(xml_writer)
Return xWriter.ToString

End Function

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

Dim author As String
Dim title As String
Dim genre As String

Dim xDoc As New XmlDocument
Dim xAuthor As XmlElement
Dim xTitle As XmlElement
Dim xGenre as XmlElement

xDoc.LoadXml(xml)
If xDoc.DocumentElement.Name = "xml" Then
    xAuthor = xDoc.FirstChild.Item("author")
    xTitle = xDoc.FirstChild.Item("title")

    author = xAuthor.FirstChild.Value
    title = xTitle.FirstChild.Value
    genre = xGenre.FirstChild.Value
End If

ShowMessage(author, title, genre)

Спасибо за помощь! KJ

1 голос
/ 05 ноября 2008

Ну, я не знаю, если это то, что вы ищете, но если вы используете последнюю версию VB и .NET, то вы сможете использовать литералы xml и LINQ для анализа вашего xml: Например, так ->

Sub Send()
    Dim myxml = <xml>
                   <author>Joe the Magnificent</author>
                   <title>Joe Goes Home</title>
                </xml>
Readxml(myxml)
End Sub

Sub Readxml(myxml as XDocument)
Dim Data = From xml in myxml...<xml> _
           Select New With {.Author = xml.<author>.value, _
                            .title = xml.<title>.value}

For each item in Data
    ShowMessage(item.Author,Item.Title)
Next
End Sub

Обратите внимание, что приведенный выше код является просто кодом, поэтому он может не работать, не на моем компьютере, поэтому я не могу его проверить.

0 голосов
/ 06 декабря 2018

Создайте такой класс:

Imports System.Data

Public Class STKReservedStock_insertrow
Inherits Request
Public Sub New(User As String, Company As String)
    MyBase.New("stkreservestockall", User, Company)
End Sub


#Region "Properties"

Public Property _pdt As String
    Get
        Return DirectCast(Field("pdt"), String)
    End Get
    Set(ByVal value As String)
        Field("pdt") = value
    End Set
End Property
Public Property _whse As String
    Get
        Return DirectCast(Field("whse"), String)
    End Get
    Set(ByVal value As String)
        Field("whse") = value
    End Set
End Property
Public Property _traceNumber As Integer
    Get
        Return DirectCast(Field("traceNumber"), Integer)
    End Get
    Set(ByVal value As Integer)
        Field("traceNumber") = value
    End Set
End Property
Public Property _bin As String
    Get
        Return DirectCast(Field("bin"), String)
    End Get
    Set(ByVal value As String)
        Field("bin") = value
    End Set
End Property
Public Property _lotref As String
    Get
        Return DirectCast(Field("lotref"), String)
    End Get
    Set(ByVal value As String)
        Field("lotref") = value
    End Set
End Property
Public Property _packUOM As String
    Get
        Return DirectCast(Field("packUOM"), String)
    End Get
    Set(ByVal value As String)
        Field("packUOM") = value
    End Set
End Property
Public Property _grade As String
    Get
        Return DirectCast(Field("grade"), String)
    End Get
    Set(ByVal value As String)
        Field("grade") = value
    End Set
End Property
Public Property _shpLabel As Integer
    Get
        Return DirectCast(Field("shpLabel"), Integer)
    End Get
    Set(ByVal value As Integer)
        Field("shpLabel") = value
    End Set
End Property
Public Property _countLoc As String
    Get
        Return DirectCast(Field("countLoc"), String)
    End Get
    Set(ByVal value As String)
        Field("countLoc") = value
    End Set
End Property
Public Property _palletType As String
    Get
        Return DirectCast(Field("palletType"), String)
    End Get
    Set(ByVal value As String)
        Field("palletType") = value
    End Set
End Property
Public Property _subPdt As String
    Get
        Return DirectCast(Field("subPdt"), String)
    End Get
    Set(ByVal value As String)
        Field("subPdt") = value
    End Set
End Property
Public Property _subTn As Integer
    Get
        Return DirectCast(Field("subTn"), Integer)
    End Get
    Set(ByVal value As Integer)
        Field("subTn") = value
    End Set
End Property
Public Property _origReserved As Decimal
    Get
        Return DirectCast(Field("origReserved"), Integer)
    End Get
    Set(ByVal value As Decimal)
        Field("origReserved") = value
    End Set
End Property
Public Property _reserved As Decimal
    Get
        Return DirectCast(Field("reserved"), Integer)
    End Get
    Set(ByVal value As Decimal)
        Field("reserved") = value
    End Set
End Property
Public Property _dateReserved As Date
    Get
        Return DirectCast(Field("dateReserved"), Date)
    End Get
    Set(ByVal value As Date)
        Field("dateReserved") = value
    End Set
End Property
Public Property _reservedBy As String
    Get
        Return DirectCast(Field("reservedBy"), String)
    End Get
    Set(ByVal value As String)
        Field("reservedBy") = value
    End Set
End Property
Public Property _reason As String
    Get
        Return DirectCast(Field("reason"), String)
    End Get
    Set(ByVal value As String)
        Field("reason") = value
    End Set
End Property
Public Property _party As String
    Get
        Return DirectCast(Field("party"), String)
    End Get
    Set(ByVal value As String)
        Field("party") = value
    End Set
End Property
Public Property _Cancelled As String
    Get
        Return DirectCast(Field("Cancelled"), String)
    End Get
    Set(ByVal value As String)
        Field("Cancelled") = value
    End Set
End Property
Public Property _CancelledByUsr As String
    Get
        Return DirectCast(Field("CancelledByUsr"), String)
    End Get
    Set(ByVal value As String)
        Field("CancelledByUsr") = value
    End Set
End Property
Public Property _RsvQty As Decimal
    Get
        Return DirectCast(Field("RsvQty"), Integer)
    End Get
    Set(ByVal value As Decimal)
        Field("RsvQty") = value
    End Set
End Property
#End Region

End Class

Тогда просто пошлите это так:

        Dim XMLRqst As New STKReservedStock_insertrow(User, Company)

    Rqst._pdt = If(IsDBNull(drStock.Item("pdt")), "", drStock.Item("pdt").ToString)
    Rqst._whse = If(IsDBNull(drStock.Item("whse")), "", drStock.Item("whse").ToString)
    Rqst._traceNumber = If(IsDBNull(drStock.Item("traceNumber")), 0, CInt(drStock.Item("traceNumber")))
    Rqst._bin = If(IsDBNull(drStock.Item("bin")), "", drStock.Item("bin").ToString)
    Rqst._lotref = If(IsDBNull(drStock.Item("lotref")), "", drStock.Item("lotref").ToString)
    Rqst._packUOM = If(IsDBNull(drStock.Item("packUOM")), "", drStock.Item("packUOM").ToString)
    Rqst._grade = If(IsDBNull(drStock.Item("grade")), "", drStock.Item("grade").ToString)
    Rqst._shpLabel = If(IsDBNull(drStock.Item("shpLabel")), 0, CInt(drStock.Item("shpLabel")))
    Rqst._countLoc = If(IsDBNull(drStock.Item("countLoc")), "", drStock.Item("countLoc").ToString)
    Rqst._palletType = If(IsDBNull(drStock.Item("palletType")), "", drStock.Item("palletType").ToString)
    Rqst._subPdt = If(IsDBNull(drStock.Item("subPdt")), "", drStock.Item("subPdt").ToString)
    Rqst._subTn = If(IsDBNull(drStock.Item("subTn")), 0, CInt(drStock.Item("subTn")))
    Rqst._origReserved = reservedqty
    Rqst._reserved = reservedqty
    Rqst._dateReserved = Now
    Rqst._reservedBy = User
    Rqst._reason = reason
    Rqst._party = party
    Rqst._Cancelled = "f"
    Rqst._CancelledByUsr = ""
    Rqst._RsvQty = reservedqty

Send(XMLRqst.toxml)

Отправка, очевидно, будет вашей подпрограммой отправки (куда бы она ни отправляла)

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