A forma XML de documentos WordprocessingML (LINQ to XML)
Este artigo apresenta a forma XML de um documento WordprocessingML.
Formatos do Microsoft Office
O formato de arquivo nativo para o 2007 Microsoft Office system é o Office Open XML (comumente chamado de Open XML). O Open XML é um formato baseado em XML que é um padrão Ecma e está atualmente passando pelo processo de padrões ISO-IEC. A linguagem de marcação para arquivos de processamento de texto dentro do Open XML é chamada WordprocessingML. Este tutorial usa arquivos de origem WordprocessingML como entrada para os exemplos.
Se estiver a utilizar o Microsoft Office 2003, pode guardar documentos no formato Office Open XML se tiver instalado o Pacote de Compatibilidade do Microsoft Office para Formatos de Ficheiro do Word, Excel e PowerPoint 2007.
A forma dos documentos WordprocessingML
A primeira coisa a entender é a forma XML dos documentos WordprocessingML. Um documento WordprocessingML contém um elemento body (chamado w:body
) que contém os parágrafos do documento. Cada parágrafo contém uma ou mais execuções de texto (nomeadas w:r
). Cada execução de texto contém uma ou mais partes de texto (nomeadas w:t
).
O seguinte é um documento WordprocessingML muito simples:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<w:document
xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
xmlns:w10="urn:schemas-microsoft-com:office:word"
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml">
<w:body>
<w:p w:rsidR="00E22EB6"
w:rsidRDefault="00E22EB6">
<w:r>
<w:t>This is a paragraph.</w:t>
</w:r>
</w:p>
<w:p w:rsidR="00E22EB6"
w:rsidRDefault="00E22EB6">
<w:r>
<w:t>This is another paragraph.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
Este documento contém dois parágrafos. Ambos contêm uma única execução de texto, e cada execução de texto contém uma única parte de texto.
A maneira mais fácil de ver o conteúdo de um documento WordprocessingML no formato XML é criar um usando o Microsoft Word, salvá-lo e, em seguida, executar o seguinte programa que imprime o XML no console.
Este exemplo usa classes encontradas no assembly WindowsBase. Ele usa tipos no System.IO.Packaging namespace.
const string documentRelationshipType =
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
const string wordmlNamespace =
"http://schemas.openxmlformats.org/wordprocessingml/2006/main";
XNamespace w = wordmlNamespace;
using (Package wdPackage = Package.Open("SampleDoc.docx", FileMode.Open, FileAccess.Read))
{
PackageRelationship relationship =
wdPackage
.GetRelationshipsByType(documentRelationshipType)
.FirstOrDefault();
if (relationship != null)
{
Uri documentUri =
PackUriHelper.ResolvePartUri(
new Uri("/", UriKind.Relative),
relationship.TargetUri);
PackagePart documentPart = wdPackage.GetPart(documentUri);
// Get the officeDocument part from the package.
// Load the XML in the part into an XDocument instance.
XDocument xdoc =
XDocument.Load(XmlReader.Create(documentPart.GetStream()));
Console.WriteLine(xdoc.Root);
}
}
Imports <xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
Module Module1
Sub Main()
Dim documentRelationshipType = _
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
Using wdPackage As Package = _
Package.Open("SampleDoc.docx", _
FileMode.Open, FileAccess.Read)
Dim docPackageRelationship As PackageRelationship = wdPackage _
.GetRelationshipsByType(documentRelationshipType).FirstOrDefault()
If (docPackageRelationship IsNot Nothing) Then
Dim documentUri As Uri = PackUriHelper.ResolvePartUri( _
New Uri("/", UriKind.Relative), _
docPackageRelationship.TargetUri)
Dim documentPart As PackagePart = wdPackage.GetPart(documentUri)
' Get the officeDocument part from the package.
' Load the XML in the part into an XDocument instance.
Dim xDoc As XDocument = _
XDocument.Load(XmlReader.Create(documentPart.GetStream()))
Console.WriteLine(xDoc.Root)
End If
End Using
End Sub
End Module