Como faço para adicionar um tipo de documento para um XDocument?
-
06-07-2019 - |
Pergunta
Eu tenho um objeto XDocument existente que gostaria de adicionar um doctype XML para. Por exemplo:
XDocument doc = XDocument.Parse("<a>test</a>");
Eu posso criar um XDocumentType usando:
XDocumentType doctype = new XDocumentType("a", "-//TEST//", "test.dtd", "");
Mas como posso aplicar isso para o XDocument existente?
Solução
Você pode adicionar um XDocumentType
a um XDocument
existente, mas deve ser o primeiro elemento adicionado. A documentação sobre esta é vaga.
Graças à Jeroen para sublinhar a abordagem conveniente de usar AddFirst
nos comentários. Esta abordagem permite que você escreva o seguinte código, que mostra como adicionar o XDocumentType
após a XDocument
já tem elementos:
var doc = XDocument.Parse("<a>test</a>");
var doctype = new XDocumentType("a", "-//TEST//", "test.dtd", "");
doc.AddFirst(doctype);
Como alternativa, você pode usar o método Add
para adicionar um XDocumentType
a um XDocument
existente, mas a ressalva é que nenhum outro elemento deve existir uma vez que tem de ser o primeiro.
XDocument xDocument = new XDocument();
XDocumentType documentType = new XDocumentType("Books", null, "Books.dtd", null);
xDocument.Add(documentType);
Por outro lado, o seguinte é inválido e resultaria em um InvalidOperationException: "Esta operação criaria um documento estruturado de forma incorrecta"
xDocument.Add(new XElement("Books"));
xDocument.Add(documentType); // invalid, element added before doctype
Outras dicas
Apenas passá-lo para o XDocument
construtor ( full exemplo ):
XDocument doc = new XDocument(
new XDocumentType("a", "-//TEST//", "test.dtd", ""),
new XElement("a", "test")
);
ou uso XDocument.Add
(a XDocumentType
tem de ser adicionada antes de o elemento de raiz):
XDocument doc = new XDocument();
doc.Add(new XDocumentType("a", "-//TEST//", "test.dtd", ""));
doc.Add(XElement.Parse("<a>test</a>"));