2009-09-11 6 views
12

私はXML Doctypeを追加したい既存のXDocumentオブジェクトを持っています。たとえば:XDocumentにドキュメントタイプを追加するにはどうすればよいですか?

XDocument doc = XDocument.Parse("<a>test</a>"); 

私が使用してXDocumentTypeを作成することができます。

XDocumentType doctype = new XDocumentType("a", "-//TEST//", "test.dtd", ""); 

しかし、どのように、私は、既存のXDocumentにすることを適用するのですか?

答えて

14

あなたはXDocumentTypeを追加することができます既存のXDocumentですが、追加する最初の要素である必要があります。これを取り巻くドキュメントはあいまいです。

コメントの中でAddFirstを使用する便利な方法を指摘してくれたJeroenに感謝します。既存XDocumentXDocumentTypeを追加するAddメソッドを使用することができ、

var doc = XDocument.Parse("<a>test</a>"); 
var doctype = new XDocumentType("a", "-//TEST//", "test.dtd", ""); 
doc.AddFirst(doctype); 

代わりに、しかし、このアプローチは、すでに要素を持っているXDocumentXDocumentTypeを追加する方法を示し、次のコードを、書くことができます最初のものでなければならないので、他の要素が存在してはならないということです。一方

​​

、以下は無効であり、InvalidOperationExceptionがもたらすであろう:「この操作は間違って構造化文書を作成します。」

xDocument.Add(new XElement("Books")); 
xDocument.Add(documentType); // invalid, element added before doctype 
+0

これはXDocumentにも当てはまりますか? MSDNリンクはXmlDocumentを指します。 – dtb

+1

@dtb:それはありますが、MSDNのXDocumentには記載されていません。また、更新されたコードとInvalidOperationExceptionも参照してください。 –

+1

後でXDocumentTypeを追加することはできますが、XDocumentTypeが 'XDocument'の最初の要素であることを確認する必要があります。 'xDocument.Add(documentType)'の代わりに 'xDocument.AddFirst(documentType)'を使うことでそれを行うことができます。 –

3

だけXDocument constructorfull example)に渡し:

XDocument doc = new XDocument(
    new XDocumentType("a", "-//TEST//", "test.dtd", ""), 
    new XElement("a", "test") 
); 

またはXDocument.Addを使用(XDocumentTypeは、ルート要素の前に追加する必要があります):

XDocument doc = new XDocument(); 
doc.Add(new XDocumentType("a", "-//TEST//", "test.dtd", "")); 
doc.Add(XElement.Parse("<a>test</a>")); 
関連する問題