如何查找以撇号开头的XML节点的内容?

时间:2013-08-09 17:42:00

标签: xml vb.net xml-parsing

我有一些代码用于尝试在VB.NET中学习XML解析。 (甚至不确定这是否可行;只是想看看我对目前正在阅读的内容的理解是否准确,所以在初学者级编程中请耐心等待。)

    XMLQuotes = New XmlDocument
    XMLQuotes.Load("XMLDocs/IKAbx.xml")

    Dim nodAuthor As XmlElement = XMLQuotes.DocumentElement
    Dim nodItems As XmlNodeList = nodAuthor.SelectNodes("/Authors/Author")
    For i = 0 To nodItems.Count - 1
        'grab info from the XML using the supplied node
        authorName = GetNodeValue("Name", doc)
        'etc.

        'try to get a list of quotes from the author.

'the next line is the line that does not work.
        Dim nodQuotes As XmlNodeList = nodReqs.SelectNodes("/Authors/Author[Name='" & Replace(nodItems(i).Item("Name").InnerXml, "'", "'") & "']/Quote")
        For j = 0 To nodQuotes.Count - 1
            quotes.Add nodBonSk(j).InnerXml
        Next

        'continue processing
    Next I

这个过程很有效,只有一个例外。如果我有一个以撇号开头的引用(例如“'在心中更高贵......'[是的,我确实知道那个引用以”是否“开头,但这是为了说明这一点] ),然后它实际上并没有找到具有相应Name元素的节点。它返回0个节点的计数并继续。

我已经尝试在XML文件中使用&',&#39转义字符(甚至尝试过纯粹的单引号),但似乎没有任何效果。 那么,我做错了什么?

Private Function GetNodeValue(nodeName As String, doc As String) As Object
    Dim doc2 As XDocument = XDocument.Parse(doc)
    Dim element = doc2.Root.Element(nodeName)

    If IsNothing(element) Then
        Return Nothing
    Else
        Return element.Value
    End If
End Function

1 个答案:

答案 0 :(得分:2)

您需要向SelectNodes发送一个使用双引号作为字符串分隔符的字符串。对于VB.Net,使用双引号来转义字符串中的双引号,因为字符串本身是用双引号分隔的。

Dim cXQuery as String
cXQuery = "/Authors/Author[Name=""" & nodItems(i).Item("Name").InnerXml & """]/Quote

Dim nodQuotes As XmlNodeList 
nodQuotes = nodReqs.SelectNodes(cXQuery)

(您可能还想为每个XMLNode元素抓取一个Authors/Author对象,然后只需调用selectNodes("Quote")即可获得每个作者的引号,但这不是您提出的问题。)