LINQ к XML в VB.NET

Вот расширение, которое вы можете использовать, работая с Swift 3.1. Один индекс вернет Character, что кажется интуитивно понятным при индексации String, а Range вернет String.

extension String {
    subscript (i: Int) -> Character {
        return Array(self.characters)[i]
    }

    subscript (r: CountableClosedRange<Int>) -> String {
        return String(Array(self.characters)[r])
    }

    subscript (r: CountableRange<Int>) -> String {
        return self[r.lowerBound...r.upperBound-1]
    }
}

Некоторые примеры расширения в действии:

let string = "Hello"

let c1 = string[1]  // Character "e"
let c2 = string[-1] // fatal error: Index out of range

let r1 = string[1..<4] // String "ell"
let r2 = string[1...4] // String "ello"
let r3 = string[1...5] // fatal error: Array index is out of range



n.b. Вы можете добавить дополнительный метод к вышеприведенному расширению, чтобы при желании возвращать String с одним символом:

subscript (i: Int) -> String {
    return String(self[i])
}

Обратите внимание, что тогда вам придется явно указать тип, который вы хотели при индексировании строки:

let c: Character = string[3] // Character "l"
let s: String = string[0]    // String "H"
8
задан Reinstate Monica 7 July 2015 в 10:48
поделиться

3 ответа

Марк прав, VB позволяет делать много хороших вещей. Я сам разбираюсь в C #, но я только что придумал решение VB, чтобы посмотреть, как это сделать за вас. Я разместил код ниже и объяснил ключевые части. Я был очень впечатлен возможностями VB для Xml!

Я вижу в вашем примере кода, что вам уже удалось загрузить свой Xml в XDocument. После того, как вы завершили свой XDocument.Load, вы можете получить доступ к XML-документу, используя специальный синтаксис.

Для начала мы хотим получить все продукты из документа; т.е. все элементы . Нам нужно сделать следующее:

Dim products = productsDoc...<Product>

Это говорит о том, что вам нужны все элементы из документа. Это дает нам IEnumerable коллекцию XElements.

После того, как мы вытащили отдельный продукт из коллекции, мы захотим получить к нему доступ » s такие значения, как его имя или цена. Для этого нам нужно сделать следующее:

' this gets the value of the price element within a product
product.<Price>.Value

Вот полный пример вместе с ожидаемым результатом, на который вы можете посмотреть:

Module Module1

    ' some products xml to use for this example
    Dim productsXml = <Xml>
                          <Product>
                              <Name>Mountain Bike</Name>
                              <Price>59.99</Price>
                          </Product>
                          <Product>
                              <Name>Arsenal Football</Name>
                              <Price>9.99</Price>
                          </Product>
                          <Product>
                              <Name>Formula One Cap</Name>
                              <Price>14.99</Price>
                          </Product>
                          <Product>
                              <Name>Robin Hood Bow</Name>
                              <Price>8.99</Price>
                          </Product>
                      </Xml>

    Sub Main()

        ' load the xml into an XDocument
        ' NOTE: this line isn't needed when using inline XML as per this example, 
        ' but I wanted to make this code easy to modify for reading in text files
        Dim productsDoc = System.Xml.Linq.XDocument.Parse(productsXml.ToString())

        ' get all <Product> elements from the XDocument
        Dim products = From product In productsDoc...<Product> _
                       Select product

        ' go through each product
        For Each product In products
            ' output the value of the <Name> element within product
            Console.WriteLine("Product name is {0}", product.<Name>.Value)
            ' output the value of the <Price> element within product
            Console.WriteLine("Product price is {0}", product.<Price>.Value)
        Next

    End Sub

End Module

Вывод программы:

Product name is Mountain Bike
Product price is 59.99
Product name is Arsenal Football
Product price is 9.99
Product name is Formula One Cap
Product price is 14.99
Product name is Robin Hood Bow
Product price is 8.99

Я надеюсь, что это было полезно. Если вам нужна дополнительная информация, просто спросите: -)

Трудно написать что-то связное перед сном! : -)

11
ответ дан 5 December 2019 в 13:01
поделиться

Хорошо, как насчет этого?

Dim productXML As XDocument = XDocument.Load( _    
    Server.MapPath("~/App_Data/products.xml"))    
'
For Each product as Product In productXML.Document.Elements("Product")
    'do something with each product
Next
0
ответ дан 5 December 2019 в 13:01
поделиться

Доктор Джонс опубликовал отличный пример!

Чтобы получить коллекцию объектов именованного типа, в отличие от объектов анонимного типа (оба строго типизированы), сделайте следующее:

Module Module1

' some products xml to use for this example '
    Dim productsXml As XElement = _
    <Xml>
        <Product>
            <Name>Mountain Bike</Name>
            <Price>59.99</Price>
        </Product>
        <Product>
            <Name>Arsenal Football</Name>
            <Price>9.99</Price>
        </Product>
        <Product>
            <Name>Formula One Cap</Name>
            <Price>14.99</Price>
        </Product>
        <Product>
            <Name>Robin Hood Bow</Name>
            <Price>8.99</Price>
        </Product>
    </Xml>

Class Product

    Private _name As String
    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property

    Private _price As Double
    Public Property Price() As Double
        Get
            Return _price
        End Get
        Set(ByVal value As Double)
            _price = value
        End Set
    End Property

End Class

Sub Main()

    ' get an IEnumerable of Product objects '
    Dim products = From prod In productsXml...<Product> _
                   Select New Product With {.Name = prod.<Name>.Value, .Price = prod.<Price>.Value}

    ' go through each product '
    For Each prod In products
        ' output the value of the <Name> element within product '
        Console.WriteLine("Product name is {0}", prod.Name)
        ' output the value of the <Price> element within product '
        Console.WriteLine("Product price is {0}", prod.Price)
    Next

End Sub

End Module
2
ответ дан 5 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: