我正试图从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和页面级别。任何帮助将不胜感激。
答案 0 :(得分:0)
答案 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 +或修改为旧语法)。