我有这样的XML格式:
<?xml version="1.0" encoding="Windows-1252"?>
<!--MasterMusik Video Database-->
<Videos>
<Video><Name>SKRILLEX & 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>
我想按照“名称”标签对元素进行排序。
这是我用来对元素Sort XML document
进行排序的函数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 & 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)
此时有两个问题:
输出缩进。
XML的声明不是<?xml version="1.0" encoding="Windows-1252"?>
,我需要手动编写。
我如何解决这两个问题?
答案 0 :(得分:2)
试试这个
IO.File.WriteAllText("Sorted Videox.xml", xdoc.ToString(SaveOptions.DisableFormatting))
答案 1 :(得分:2)
一旦开始操纵XDocument
,格式就会丢失。您的排序方法只返回纯XML元素的列表。因此,您有两种选择:
使用文本比较对文件进行排序。这应该不会太难,因为<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())
或者,使用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))