Como Trabalhar com Marcação Personalizada XML no .NET
Como Trabalhar com Marcação XML Personalizada em .NET
Um documento do Word pode conter dados XML personalizados juntamente com seu conteúdo visível — dados usados para vincular controles de conteúdo, armazenar metadados específicos de aplicativo ou incorporar partes adicionadas por outro aplicativo. Este guia mostra como ler esses dados, adicionar novas partes XML personalizadas e inspecionar as tags inteligentes legadas que documentos mais antigos ainda podem conter, usando CustomXmlPart, CustomXmlProperty e SmartTag em Aspose.Words FOSS para .NET.
Guia Passo a Passo
Etapa 1: Ler Dados XML Personalizados de um Documento
Document.CustomXmlParts retorna um CustomXmlPartCollection — o mesmo mecanismo que o Word usa para suportar controles de conteúdo mapeados a XML. Percorra a coleção ou chame GetById(id) quando já souber qual parte precisa, para obter um CustomXmlPart. Cada parte expõe Id, um array de bytes Data contendo o XML bruto, um DataChecksum para detectar se os dados foram alterados sem uma comparação completa de bytes, e Schemas — um CustomXmlSchemaCollection listando os esquemas XML associados a ele.
Etapa 2: Adicionar ou Atualizar uma Parte XML Personalizada
Chame CustomXmlPartCollection.Add(id, xml) com uma string de id e o conteúdo XML para criar uma parte diretamente, ou construa um CustomXmlPart separadamente e passe-o para Add(part). Para remover dados, use RemoveAt(index) em uma posição específica ou Clear() para descartar todas as partes. Ao copiar dados XML personalizados entre documentos, use CustomXmlPart.Clone() (ou o Clone() da coleção) na parte de origem em vez de reler e readicionar o XML bruto, então adicione o clone ao Document.CustomXmlParts do documento de destino.
Etapa 3: Gerenciar os esquemas associados a uma parte
CustomXmlPart.Schemas atinge um CustomXmlSchemaCollection, que rastreia os URIs de esquema associados à parte como strings simples em vez de objetos de esquema analisados. Use Add(value) para registrar um URI de esquema, Remove(name) ou RemoveAt(index) para descartar um, IndexOf(value) para localizar um e Clear() para removê-los todos. Count informa quantos URIs de esquema estão atualmente associados à parte.
Etapa 4: Trabalhar com partes personalizadas ao nível do pacote
Nem toda parte não visível em um pacote OOXML é XML personalizada. Document.PackageCustomParts devolve um CustomPartCollection de objetos CustomPart — partes arbitrárias armazenadas no pacote, como partes adicionadas por outra aplicação que modificou o arquivo. Cada CustomPart possui um Name, ContentType, RelationshipType, um array de bytes Data e um sinalizador IsExternal indicando se é uma referência externa em vez de conteúdo incorporado. Add(part), RemoveAt(index) e Clear() gerenciam a coleção da mesma forma que CustomXmlPartCollection. Verifique PackageCustomParts — e não CustomXmlParts — quando uma parte que seu documento deveria conter não aparece na coleção XML personalizada.
Etapa 5: Inspecionar tags inteligentes legadas e suas propriedades
SmartTag é um tipo de nó (NodeType.SmartTag, construído com SmartTag(doc)) que representa uma tag inteligente legada do Word envolvendo texto reconhecido. Verifique Element e Uri juntos para identificar qual reconhecedor criou a tag, então leia Properties — um CustomXmlPropertyCollection — para os dados estruturados que o reconhecedor anexou. Dentro de um CustomXmlPropertyCollection, o indexador (por exemplo, properties["MyProp"]) ou Contains(name) procuram uma propriedade específica, IndexOfKey(name) devolve sua posição, e Remove(name)/RemoveAt(index)/Clear() removem entradas; cada CustomXmlProperty é construído com CustomXmlProperty(name, uri, value) e expõe Name, Uri e Value. Como SmartTag deriva de CompositeNode, ele também participa da árvore do documento como outros nós, suportando Accept(visitor), AcceptStart(visitor) e AcceptEnd(visitor) para travessia baseada em DocumentVisitor.
Problemas Comuns e Soluções
CustomXmlPartCollection.GetById(id) não retorna nada utilizável. O ID não corresponde a nenhuma parte atualmente em Document.CustomXmlParts. Enumere a coleção para confirmar que o ID está presente, ou adicione a parte primeiro com Add(id, xml).
Uma parte adicionada por outra aplicação não é encontrada ao iterar CustomXmlParts. Partes de pacote não-XML são expostas através de Document.PackageCustomParts, não CustomXmlParts. Verifique PackageCustomParts (a CustomPartCollection) em vez disso.
SmartTag.Properties está vazio embora a tag esteja claramente presente. Nem todo reconhecedor de smart tag anexa propriedades estruturadas. Verifique SmartTag.Element and Uri para confirmar qual reconhecedor criou a tag antes de assumir que propriedades específicas estarão presentes.
Os dados personalizados de XML não parecem estar relacionados ao controle de conteúdo ao qual deveriam estar vinculados. Os controles de conteúdo vinculam-se ao XML personalizado por meio de sua própria configuração de vinculação de dados, não automaticamente a todos os CustomXmlPart in Document.CustomXmlParts. Confirme a qual parte um determinado controle de conteúdo está realmente vinculado, em vez de assumir um relacionamento um-para-um.
Perguntas Frequentes
Como adiciono dados customizados de XML a um documento?
Chame Document.CustomXmlParts.Add(id, xml) com uma string de id e conteúdo de XML, ou construa um CustomXmlPart separadamente e passe-o para Add(part).
Qual é a diferença entre CustomXmlPart e CustomXmlProperty?
CustomXmlPart é uma ilha de dados XML completa — uma carga útil de array de bytes mais esquemas associados — acessada através de Document.CustomXmlParts. CustomXmlProperty é um par nome/valor único, normalmente acessado através de SmartTag.Properties em vez de diretamente do documento.
Como copio dados personalizados XML de um documento para outro?
Chame Clone() no CustomXmlPart de origem, então adicione o clone ao Document.CustomXmlParts do documento de destino com Add(part).
O que é um SmartTag e quando eu encontraria um?
SmartTag é um recurso legado do Word que representa texto reconhecido e encapsulado por um reconhecedor de smart-tag — um nó de documento (NodeType.SmartTag) com um Element e Uri que identificam o reconhecedor, além de uma coleção Properties de valores CustomXmlProperty. Ele aparece em documentos que foram criados ou editados com smart tags ativados em versões mais antigas do Word.
Como descubro quantas partes personalizadas XML ou partes de pacote um documento possui?
Leia Count em Document.CustomXmlParts (um CustomXmlPartCollection) ou Document.PackageCustomParts (um CustomPartCollection), respectivamente.