XML SDK 2.0 для чтения подробностей / свойств файла Office 10 - PullRequest
1 голос
/ 25 мая 2011

Мне нужно прочитать информацию о файле, особенно об авторах, названии, теме, из новых файлов 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 ]

2 голосов
/ 26 августа 2013

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

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

WDRetrieveCoreProperty(textBox1.Text, "cp:lastModifiedBy");
0 голосов
/ 24 октября 2011

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

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();
     }
...