kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

OneNoteをCOMで使う3回目

OneNoteをCOM経由で使う2回目 - 新日々此何有哉
いいヒントがあったので、前進…なのですが、OneNoteXMLの要素には接頭語がついているようです(one:section)。
Sample Code/App :: OneNote Stats - Engineering OneNote Blog - Site Home - MSDN Blogs
ここの例にあるように、XmlDocument経由では扱えるのですが、LINQ to XMLのXDocumentではどうするんでしょう…あ、XNamespace クラス (System.Xml.Linq)を使えばいいのか。

  // XmlDocument版
  String strXML = default(string);
  onApplication.GetHierarchy(null, HierarchyScope.hsPages, out strXML);
  var oneNoteXML = new XmlDocument();
  oneNoteXML.LoadXml(strXML);
  XmlNamespaceManager nsmgr = new XmlNamespaceManager(oneNoteXML.NameTable);

  string OneNoteNamespace = "http://schemas.microsoft.com/office/onenote/2007/onenote";
  nsmgr.AddNamespace("one",OneNoteNamespace);

  XmlNodeList notebooks = oneNoteXML.SelectNodes("//one:Notebook", nsmgr);
  System.Console.WriteLine("You have " + notebooks.Count + " notebooks");

  XmlNodeList sections = oneNoteXML.SelectNodes("//one:Section", nsmgr);
  System.Console.WriteLine("You have " + sections.Count + " sections");

  XmlNodeList pages = oneNoteXML.SelectNodes("//one:Page", nsmgr);
  System.Console.WriteLine("You have " + pages.Count + " pages"); 
//LINQ to XML版。ノートブック一覧を取得
  String strXML = default(string);
  onApplication.GetHierarchy(null, HierarchyScope.hsPages, out strXML);
  var oneNoteXML = XDocument.Parse(strXML);
  XNamespace oneNoeteIns = "http://schemas.microsoft.com/office/onenote/2007/onenote";

  var noteBooks = from p in oneNoteXML.Root.Elements(oneNoeteIns + "Notebook")
                  select p;

  foreach (var book in noteBooks){
    Console.WriteLine("{0}", book.Attribute("name"));
  }

なるほど。