1

我有这样的 XML 格式:

<?xml version="1.0" encoding="Windows-1252"?>
<!--MasterMusik Video Database-->
<Videos>
  <Video><Name>SKRILLEX &amp; WOLFGANG GARTNER - THE DEVIL's DEN</Name><Genre>Techno</Genre><Format>mp4</Format><HD>HD</HD><Resolution>1280x720</Resolution><Size>70,57</Size></Video>
  <Video><Name>4 Strings - Let It Rain</Name><Genre>Dance</Genre><Format>mp4</Format><HD>HD</HD><Resolution>1920x1080</Resolution><Size>129,3</Size></Video>
  <Video><Name>Deadmau5 - I Remember (Live At Roskilde Festival)</Name><Genre>Trance</Genre><Format>mkv</Format><HD>SD</HD><Resolution>704x384</Resolution><Size>97,99</Size></Video>
</Videos>

我想按元素的“名称”标签对元素进行排序。

这是我用来对元素排序的函数排序 XML 文档

Private Function XML_Sort(ByVal xdoc As XDocument, _
                          ByVal Root_Element As String, _
                          ByVal Element_to_sort As String) As XDocument

    Try

        xdoc.Root.ReplaceNodes(xdoc.Root.Elements(Root_Element) _
                              .OrderBy(Function(sort) sort.Element(Element_to_sort).Value))

        Return xdoc

    Catch ex As Exception
        Throw New Exception(ex.Message)

    End Try

End Function

但是我得到的输出是完全缩进的:

<!--MasterMusik Video Database-->
<Videos>
  <Video>
    <Name>4 Strings - Let It Rain</Name>
    <Genre>Dance</Genre>
    <Format>mp4</Format>
    <HD>HD</HD>
    <Resolution>1920x1080</Resolution>
    <Size>129,3</Size>
  </Video>
  <Video>
    <Name>Deadmau5 - I Remember (Live At Roskilde Festival)</Name>
    <Genre>Trance</Genre>
    <Format>mkv</Format>
    <HD>SD</HD>
    <Resolution>704x384</Resolution>
    <Size>97,99</Size>
  </Video>
  <Video>
    <Name>SKRILLEX &amp; WOLFGANG GARTNER - THE DEVIL's DEN</Name>
    <Genre>Techno</Genre>
    <Format>mp4</Format>
    <HD>HD</HD>
    <Resolution>1280x720</Resolution>
    <Size>70,57</Size>
  </Video>
</Videos>

这是我正在使用的用法:

Dim xdoc As XDocument = _
    XDocument.Load("Videos.xml", LoadOptions.PreserveWhitespace)

xdoc = XML_Sort(xdoc, "Video", "Name")

IO.File.WriteAllText("Sorted Videox.xml", xdoc.ToString)

此时有两个问题:

  1. 输出是缩进的。

  2. XML的声明没有写<?xml version="1.0" encoding="Windows-1252"?>,需要自己手动写。

我怎样才能解决这两个问题?

4

2 回答 2

2

尝试这个

IO.File.WriteAllText("Sorted Videox.xml", xdoc.ToString(SaveOptions.DisableFormatting))
于 2013-10-27T09:47:32.110 回答
2

一旦你开始操作你的XDocument,格式就会丢失。您的排序方法只返回纯 XML 元素的列表。因此,您有两个选择:

  1. 使用文本比较对文件进行排序。这不应该太难,因为<Name>是行中的第一个标签,所以简单地按字母顺序对文本行进行排序就足够了:

    Dim lines = File.ReadAllLines("Videos.xml")
    Dim toSort = lines.Skip(3).Take(lines.Length - 4)   ' skip first three and last line '
    Dim result =
        lines.Take(3).Concat(toSort.OrderBy(Function(s) s)).Concat({lines.Last})
    File.WriteAllLines("Sorted.xml", result.ToArray())
    
  2. 或者,使用 XDocument 进行排序(或您想做的任何其他事情),但使用您自己的输出例程:

    Dim sb As New StringBuilder()
    sb.AppendLine("<?xml version=""1.0"" encoding=""Windows-1252""?>")
    sb.AppendLine("<!--MasterMusic Video Database-->")
    sb.AppendLine("<Videos>")
    For Each video In xdoc.Root.Elements
        sb.AppendLine("  " & video.ToString(SaveOptions.DisableFormatting))
    Next
    sb.AppendLine("</Videos>")
    File.WriteAllText("Sorted.xml", sb.ToString(), Encoding.GetEncoding(1252))
    
于 2013-10-29T15:23:21.570 回答