Мне нужно проанализировать и прочитать xml с помощью vb.net 4.0 XmlDocument. Проблема в том, что xml не имеет пространства имен. У меня есть рабочий код, который использует XElement, но мне нужно использовать XmlDocument, и я не могу импортировать Xml.Linq, поэтому XElement для меня не вариант:
Dim MyXML As XElement = XElement.Load(MemoryStream)
Dim count As Integer = Integer.Parse(MyXML.@elementCount)
For Each MyXElement As XElement In MyXML.Elements
Dim Components As String() = [email protected]()
R = Single.Parse(Components(0).Substring(2))
G = Single.Parse(Components(1).Substring(2))
B = Single.Parse(Components(2).Substring(2))
EName = MyXElement.@OPFCategoryCopyName
Next
И вот мой Xml:
<?xml version = "1.0" encoding = "utf-8"?>
<categories elementCount = "18">
<category xml:space = "preserve" OPFCategoryCopyBackgroundColor = "r:0.57 g:0.48 b:0.82" OPFCategoryCopyName = "Birthday"></category>
<category xml:space = "preserve" OPFCategoryCopyBackgroundColor = "r:0.45 g:0.60 b:0.88" OPFCategoryCopyName = "Blue category"></category>
<category xml:space = "preserve" OPFCategoryCopyBackgroundColor = "r:0.92 g:0.79 b:0.40" OPFCategoryCopyName = "Brown Category"></category>
<category xml:space = "preserve" OPFCategoryCopyBackgroundColor = "r:0.63 g:0.26 b:0.80" OPFCategoryCopyName = "Family"></category>
</categories>
Теперь, если я использую XmlDocument Load/LoadXml, как я могу получить номер elementCount и OPFCategoryCopyBackgroundColor/OPFCategoryCopyName?
Любой совет или помощь очень ценятся. Заранее спасибо.
Это сработало для меня:
Using ms as MemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes("<?xml version = ""1.0"" encoding = ""utf-8""?><categories " ...))
Dim doc as XmlDocument = new XmlDocument
doc.Load(ms)
Console.WriteLine("elementCount: " & doc.SelectSingleNode("/categories/@elementCount").Value)
For Each el As XmlNode In doc.SelectNodes("/categories/category")
Console.WriteLine("OPFCategoryCopyBackgroundColor: " & el.Attributes.GetNamedItem("OPFCategoryCopyBackgroundColor").Value)
Next
End Using
с выводом:
elementCount: 18
OPFCategoryCopyBackgroundColor: r:0.57 g:0.48 b:0.82
OPFCategoryCopyBackgroundColor: r:0.45 g:0.60 b:0.88
OPFCategoryCopyBackgroundColor: r:0.92 g:0.79 b:0.40
...
Если бы в XML были пространства имен, то этот вопрос можно было бы использовать.
Ну, второй короче, так что, наверное, было бы предпочтительнее.
Если вы можете использовать System.Xml.Serialization
, это хороший вариант.
Создайте модель для вашего файла
<XmlRoot("categories")> Public Class Categories
<XmlAttribute("elementCount")> Public Property ElementCount As Integer
<XmlElement("category")> Public Property Categories As List(Of Category)
End Class
Public Class Category
<XmlIgnore> Public Property R As Double
<XmlIgnore> Public Property G As Double
<XmlIgnore> Public Property B As Double
<XmlAttribute("xml:space")> Public Property Space As String
<XmlAttribute> Public Property OPFCategoryCopyName As String
<XmlAttribute> Public Property OPFCategoryCopyBackgroundColor As String
Get
Return $"r:{R:0.00} g:{G:0.00} b:{B:0.00}"
End Get
Set(value As String)
Dim s = value.Split(" "c)
R = Double.Parse(s(0).Split(":"c)(1))
G = Double.Parse(s(1).Split(":"c)(1))
B = Double.Parse(s(2).Split(":"c)(1))
End Set
End Property
End Class
Разобрать файл на классы
Dim se As New XmlSerializer(GetType(Categories))
Dim cs = DirectCast(se.Deserialize(MemoryStream), Categories)
Dim count = cs.ElementCount
For Each c In cs.Categories
Dim r = c.R
Dim g = c.G
Dim b = c.B
Dim space = c.Space
Dim name = c.OPFCategoryCopyName
Next
Интерпретация цветов выполняется в модели, что еще больше упрощает работу конечного пользователя.
Если вы изменяете файл и записываете изменения, форматированием занимается OPFCategoryCopyBackgroundColor.Get
.
se.Serialize(*stream*, cs)
о, спасибо, отлично, только одно, оба будут работать: el.Attributes.GetNamedItem("OPFCategoryCopyBackgroundColor").Value vs el.Attributes("OPFCategoryCopyBackgroundColor").Value, так какой из них безопаснее или рекомендуется использовать?