VB. NET Переместить XML Ребенок к родителю - PullRequest
0 голосов
/ 30 января 2020

С примером XML ...

<records>
    <record>
        <id>1</id>
        <name>name</name>
        <related>
            <relatedToID>1</relatedToID>
            <relatedToName>some name</relatedToName>
        </related>
    </record>
</records>

Как бы я go о перемещении relatedToId и relatedToName на уровень имени как name, чтобы новый XML строка будет ...

<records>
    <record>
        <id>1</id>
        <name>name</name>
        <relatedToID>1</relatedToID>
        <relatedToName>some name</relatedToName>
    </record>
</records>

Я думаю, что это как-то связано с XPath или чем-то подобным, но мне трудно понять, как это сделать. XML уже загружен как строка в переменную result.

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Использование XElement

    Dim xe As XElement
    ' to load from a URI
    '   xe = XElement.Load("path here")
    ' for testing use a literal
    xe = <records>
             <record>
                 <id>1</id>
                 <name>name</name>
                 <related>
                     <relatedToID>1</relatedToID>
                     <relatedToName>some name</relatedToName>
                 </related>
             </record>
         </records>

    For Each el As XElement In xe.<record>.<related>.Elements
        xe.<record>.LastOrDefault.Add(el)
    Next

    xe.<record>.<related>.Remove()

Производит

<records>
  <record>
    <id>1</id>
    <name>name</name>
    <relatedToID>1</relatedToID>
    <relatedToName>some name</relatedToName>
  </record>
</records>
0 голосов
/ 30 января 2020

Существуют различные подходы, но начните с этого, чтобы понять механизм.

Private Sub MoveChildToParent()

    Dim mxmlString As String = "<records>
                                <record>
                                    <id>1</id>
                                    <name>name</name>
                                    <related>
                                        <relatedToID>1</relatedToID>
                                        <relatedToName>some name</relatedToName>
                                    </related>
                                </record>
                               </records>"


    Try

        Dim mXdoc As Xml.XmlDocument = New Xml.XmlDocument
        mXdoc.LoadXml(mxmlString)

        Dim mdocElement As Xml.XmlElement = mXdoc.DocumentElement

        If mdocElement IsNot Nothing AndAlso mdocElement.HasChildNodes Then

            Dim relateds As Xml.XmlNodeList = mdocElement.GetElementsByTagName("related")

            If relateds IsNot Nothing AndAlso relateds.Count > 0 Then
                For i As Integer = relateds.Count - 1 To 0 Step -1


                    If relateds(i).HasChildNodes Then

                        Dim childs As Xml.XmlNodeList = relateds(i).ChildNodes

                        For j As Integer = childs.Count - 1 To 0 Step -1
                            relateds(i).ParentNode.AppendChild(childs(j))
                        Next

                        relateds(i).ParentNode.RemoveChild(relateds(i))


                    End If



                Next
            End If

            Console.WriteLine(mXdoc.OuterXml)

        End If


    Catch ex As Exception
        Console.WriteLine(ex.ToString)
    End Try

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