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?

Foi útil?

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>"));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top