質問

次のようにSystem.Xml.Linq.XDocumentのDoctypeを作成する場合:

doc.AddFirst(new XDocumentType("html", null, null, null));

結果として保存されるXMLファイルは次で始まります:

<!DOCTYPE html >

山括弧の前の余分なスペースに注意してください。 このスペースが表示されないようにするにはどうすればよいですか? 可能であればきれいな方法が欲しい:)

役に立ちましたか?

解決

1つのアプローチは、XmlWriterのラッパークラスを記述することです。だから:

XmlWriter writer = new MyXmlWriterWrapper(XmlWriter.Create(..., settings))

次に、MyXmlWriterWrapperクラスの場合、WriteDocTypeメソッドを除き、ラップされたライターに直接コールを渡すために、XmlWriterクラスインターフェイスで各メソッドを定義します。それを次のように定義できます:

public override void WriteDocType(string name, string pubid, string sysid, string subset)
{
    if ((pubid == null) && (sysid == null) && (subset == null))
    {
        this.wrappedWriter.WriteRaw("<!DOCTYPE HTML>");
    }
    else
    {
        this.wrappedWriter.WriteDocType(name, pubid, sysid, subset);
    }
}

確かに特にクリーンなソリューションではありませんが、それで十分です。

他のヒント

XmlTextWriterに書き込む場合、スペースを取得できません:

        XDocument doc = new XDocument();
        doc.AddFirst(new XDocumentType("html", null, null, null));
        doc.Add(new XElement("foo", "bar"));

        using (XmlTextWriter writer = new XmlTextWriter("c:\\temp\\no_space.xml", null)) {
            writer.Formatting = Formatting.Indented;
            doc.WriteTo(writer);
            writer.Flush();
            writer.Close();
        }

私は間違っているかもしれませんが、このスペースはHTMLの後にもっと多くのパラメーターが期待されるためだと思います。 HTML5では許可されていますが。

少なくとも3番目のパラメーター(* .dtd)も指定してみてください。 または、次のようにします:

new XDocumentType("html", "-//W3C//DTD XHTML 1.0 Strict//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd", null)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top