XML SDK 2.0 для чтения подробностей / свойств файла Office 10

Мне нужно прочитать информацию о файле, особенно об авторах, названии, теме, из новых файлов Office (.docx, .xlsx). Я нашел эту статью от MS, у которой также есть некоторые методы - http://msdn.microsoft.com/en-us/library/bb739835%28v=office.12%29.aspx Но я, кажется, могу заставить это работать. Метод, который я использую:

public static string WDRetrieveCoreProperty(string docName, string propertyName)
{
   // Given a document name and a core property, retrieve the value of the property.
   // Note that because this code uses the SelectSingleNode method, 
   // the search is case sensitive. That is, looking for "Author" is not 
   // the same as looking for "author".

   const string corePropertiesSchema = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties";
   const string dcPropertiesSchema = "http://purl.org/dc/elements/1.1/";
   const string dcTermsPropertiesSchema = "http://purl.org/dc/terms/";

   string propertyValue = string.Empty;

   using (WordprocessingDocument wdPackage = WordprocessingDocument.Open(docName, true))
   {
      // Get the core properties part (core.xml).
      CoreFilePropertiesPart corePropertiesPart = wdPackage.CoreFilePropertiesPart;

      // Manage namespaces to perform XML XPath queries.
      NameTable nt = new NameTable();
      XmlNamespaceManager nsManager = new XmlNamespaceManager(nt);
      nsManager.AddNamespace("cp", corePropertiesSchema);
      nsManager.AddNamespace("dc", dcPropertiesSchema);
      nsManager.AddNamespace("dcterms", dcTermsPropertiesSchema);

      // Get the properties from the package.
      XmlDocument xdoc = new XmlDocument(nt);

      // Load the XML in the part into an XmlDocument instance.
      xdoc.Load(corePropertiesPart.GetStream());

      string searchString = string.Format("//cp:coreProperties/{0}", propertyName);

      XmlNode xNode = xdoc.SelectSingleNode(searchString, nsManager);
      if (!(xNode == null))
      {
         propertyValue = xNode.InnerText;
      }
   }

   return propertyValue;
}

Поэтому я называю этот метод следующим образом:

WDRetrieveCoreProperty(textBox1.Text, "Authors"); 
// textBox1 has path to some .docx file

Но это всегда возвращает ноль. Так что не так с этим?

2 ответа

Я знаю, что этот вопрос старый, но столкнулся с ним при исследовании той же проблемы. В примере на MSDN приведен пример кода для метода для извлечения основных свойств, но нет примера использования метода.

При передаче свойства для поиска вы должны включить префикс пространства имен. Таким образом, доступ к базовому свойству lastModifiedBy с помощью метода OP будет выглядеть так:

WDRetrieveCoreProperty(textBox1.Text, "cp:lastModifiedBy");

Я сделал это...

using System.IO.Packaging; // Assembly WindowsBase.dll
  :
     static void Main(string[] args)
     {
        String path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
        String file = Path.Combine(path, "Doc1.docx");

        Package docx = Package.Open(file, FileMode.Open, FileAccess.Read);
        String subject = docx.PackageProperties.Subject;
        String title = docx.PackageProperties.Title;
        docx.Close();
     }
Другие вопросы по тегам