2009-03-05 18 views
2

XHTML belgesindeki tüm varlık referanslarını nasıl çözebilirim ve IE'nin anlayabileceği düz XHTML belgesine nasıl dönüştürebilirim? Örneğin XHTML:XML'deki tüm varlık referansları nasıl çözülür ve C# 'da yeni bir XML yaratılır?

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE html [ 
    <!ENTITY D "&#x2014;"> 
    <!ENTITY o "&#x2018;"> 
    <!ENTITY c "&#x2019;"> 
    <!ENTITY O "&#x201C;"> 
    <!ENTITY C "&#x201D;"> 
]> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    </head> 
    <body> 
     &O; &C; 
    </body> 
</html> 
+0

MSIE, gösterdiğiniz mükemmel yasal XHTML'yi işleyemiyor mu? Bu bok gerçekten kırıldı. – bortzmeyer

cevap

2

bu XmlTextReader (ve XmlValidatingReader) sınıfı basit seçenektir çıkıyor - "EntityHandling".

Yani sorunun basit bir demo:

System.Xml.XmlTextReader textReader = new System.Xml.XmlTextReader("testin.xml"); 
textReader.EntityHandling = System.Xml.EntityHandling.ExpandEntities; 
System.Xml.XmlDocument outputDoc = new System.Xml.XmlDocument(); 
outputDoc.Load(textReader); 
System.Xml.XmlDocumentType docTypeIfPresent = outputDoc.DocumentType; 
if (docTypeIfPresent != null) 
    outputDoc.RemoveChild(docTypeIfPresent); 
outputDoc.Save("testout.html"); 
textReader.Close(); 

Ve belleğe belgeyi yüklemek zorunda değil, bir akış eşdeğer isterseniz:

System.Xml.XmlTextReader textReader = new System.Xml.XmlTextReader("testin.xml"); 
textReader.EntityHandling = System.Xml.EntityHandling.ExpandEntities; 
System.Xml.XmlTextWriter textWriter = new System.Xml.XmlTextWriter("testout.html", System.Text.Encoding.UTF8); 
while (textReader.Read()) 
{ 
    if (textReader.NodeType != System.Xml.XmlNodeType.DocumentType) 
     textWriter.WriteNode(textReader, false); 
    else 
     textReader.Skip(); 
} 
textWriter.Close(); 
+0

XmlWriterSettings yazıcıSettings = new XmlWriterSettings(); writerSettings.OmitXmlDeclaration = true; XmlWriter xmlWriter = XmlWriter.Create (htmlFileName, writerSettings); outputDoc.Save (xmlWriter); xmlWriter.Close(); –

+0

Merhaba, yorumu anlamıyorum - OmitXmlDeclaration da DTD'yi atlıyor mu? XML bildirimini de kaldırmanın istenmeyen yan etkisi olmaz mıydı? (bu da kodlama sorunlarına neden olabilir) – Tao

+0

hattının çıkışını değiştirinDoc.Save ("testout.html"); Kodumla , böylece xml bildirimi ihmal edilir, bu da XML yerine düz bir html oluşturulmasına neden olur –

0

xmllint bunu edebilir, xmllint C dilinde yazıldığından ve ücretsiz bir yazılım olduğundan, C# programınıza nasıl bir şekilde uyum sağlaması nispeten kolaydır. Örnek:

% cat foo.xhtml 
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE html [ 
    <!ENTITY D "&#x2014;"> 
    <!ENTITY o "&#x2018;"> 
    <!ENTITY c "&#x2019;"> 
    <!ENTITY O "&#x201C;"> 
    <!ENTITY C "&#x201D;"> 
]> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    </head> 
    <body> 
     &O; &C; 
    </body> 
</html> 

% xmllint --noent --dropdtd foo.xhtml 
<?xml version="1.0" encoding="utf-8"?> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    </head> 
    <body> 
     [Plain Unicode characters that I prefer to omit because I don't know how SO handles it] 
    </body> 
</html>