在Visual Basic中使用XML属性创建字符串数组

时间:2017-02-08 17:40:31

标签: xml vb.net

我正试图从onenote笔记本中提取信息。我发现能够的唯一方法是获取笔记本的层次结构,然后拉出所有属性,以便我可以使用它们来拉取页面的实际内容。以下是XML文档的示例。

<?xml version="1.0"?>
<one:Notebooks xmlns:one="http://schemas.microsoft.com/office/onenote/2013/onenote">
    <one:Notebook name="Notebook" nickname="Notebook" ID="**********" path="**********" lastModifiedTime="**********" color="**********">
        <one:Section name="**********" ID="**********" path="**********" lastModifiedTime="**********" color="**********">
            <one:Page ID="**********" name="**********" dateTime="**********" lastModifiedTime="**********" pageLevel="1"/>
            <one:Page ID="**********" name="**********" dateTime="**********" lastModifiedTime="**********" pageLevel="2"/>
            <one:Page ID="**********" name="**********" dateTime="**********" lastModifiedTime="**********" pageLevel="1"/>
            <one:Page ID="**********" name="**********" dateTime="**********" lastModifiedTime="**********" pageLevel="2"/>
            <one:Page ID="**********" name="**********" dateTime="**********" lastModifiedTime="**********" pageLevel="2"/>
            <one:Page ID="**********" name="**********" dateTime="**********" lastModifiedTime="**********" pageLevel="2"/>
            <one:Page ID="**********" name="**********" dateTime="**********" lastModifiedTime="**********" pageLevel="1"/>
            <one:Page ID="**********" name="**********" dateTime="**********" lastModifiedTime="**********" pageLevel="2"/>
            <one:Page ID="**********" name="**********" dateTime="**********" lastModifiedTime="**********" pageLevel="2"/>
        </one:Section>
    </one:Notebook>
</one:Notebooks>

我可以使用以下内容来提取属性:

Dim oneNote = New OneNote.Application()
oneNote.GetHierarchy(Nothing, Microsoft.Office.Interop.OneNote.HierarchyScope.hsPages, strXML)
        Dim xdoc As New XmlDocument()
        xdoc.LoadXml(strXML)
    For Each Element As XmlElement In xdoc.SelectNodes("//*")
        TextBox1.Text = TextBox1.Text & "Processing element with name: " & Element.Name & Environment.NewLine
        For Each Attribute As XmlAttribute In Element.Attributes
            TextBox1.Text = TextBox1.Text & Convert.ToChar(Keys.Tab) & Attribute.Name & ": " & Attribute.Value & Environment.NewLine
        Next
        TextBox1.Text = TextBox1.Text & Environment.NewLine
    Next

但是,当我尝试按名称提取特定属性时,会返回名称空间错误。

For Each node As XmlNode In xdoc.DocumentElement.SelectNodes("//one:Notebooks/one:Notebook/one:Section")
    TextBox1.Text = TextBox1.Text & node.Attributes.ItemOf("name").InnerText & Environment.NewLine
Next

我希望能够创建一个字符串数组,其中包含该部分的名称,页面的名称,页面的ID和页面级别。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

使用XmlDocument,您必须使用XmlNamespaceManager来使用名称空间:

config_file

输出:

  

SectionName1

我确信你可以凭借这些知识继续前进

答案 1 :(得分:0)

如果您可以使用较新的System.Xml.Linq类型(.NET 3.5+),那么您可以使用XML Literals和LINQ to XML的内置支持,它允许您导入命名空间:

Imports <xmlns:one = "http://schemas.microsoft.com/office/onenote/2010/onenote">
'...
Dim oneNote = New OneNote.Application()
Dim strXML As String = Nothing
oneNote.GetHierarchy(Nothing, Microsoft.Office.Interop.OneNote.HierarchyScope.hsPages, strXML)
Dim xml = XDocument.Parse(strXML)
Dim pages = (
    From s In xml...<one:Section>
    From p In s.<one:Page>
    Select $"Section={s.@name} Page={p.@name} PageID={p.@ID} PageLevel={p.@pageLevel}"
).ToList()

您可以修改Select子句以返回其他内容 - 例如具有您需要的属性的匿名类型 - 而不是如上所示的字符串(使用VB 14字符串插值,因此需要VS2015 +或修改为旧语法)。