2012-09-10 2 views
8

DTD başlığından "[]" karakterler: "şeklinde devam ediyor [] "DOCTYPE etiketinin sonuna, görünüşe göre dosyaların eski bir sistemden reddedilmesine neden oluyor.C# LINQ - Kaldır Geçenlerde o bir şey hariç, yapmak gerekiyordu tam olarak ne yaptığı VS2010 XML uygulamasına küçük C# pencere formları/LINQ oluşturulan

<!DOCTYPE ichicsr SYSTEM "http://www.accessdata.fda.gov/xml/icsr-xml-v2.1.dtd"> 

önce dosya .Save işlevini kullanarak program dahilinde kaydedildikten sonra Bu karakterler ekledi olsun

<!DOCTYPE ichicsr SYSTEM "http://www.accessdata.fda.gov/xml/icsr-xml-v2.1.dtd"[]> 

sonra: İşte öncesi ve sonrası var. Program bir .xml dosyasının seçilmesine izin verir, ardından belirli etiketleri kaldırarak "temizler" ve sonra kaydeder. İşlem başladığında, dosyalar DOCTYPE'de "[]" bulunmaz. Tasarruf ettikten sonra yaparlar. LINQ to XML bunları ekler mi?

bu karakterleri ekleyerek programı tutmak için herhangi bir yolu var mı?

+1

Bu Linq otomatik bir şey eklemek olacağını çok düşüktür. Neden problemin küçük bir örneğini bir araya getirip buraya koymuyorsunuz? – Icarus

cevap

11

Açıkça, XDocument biri yoksa otomatik olarak eklenir bir Belge Türü Deklarasyonu, boş bir "iç alt kümesini" içeren bir XML belgesini ayrıştırır zaman. (Iç alt küme <!DOCTYPE> yılında [] çevrili parçasıdır).

sonuç

iyi biçimli XML olduğunu. durumlar için

XDocument document = ...; 
if (document.DocumentType != null) 
    document.DocumentType.InternalSubset = null; 
+0

Teşekkürler! Bunu yapmış gibi görünüyor. Şimdiye kadar her testi geçiyor. Yeni bir 'XDocumentType' oluştururken size * * null adlı belirtebilirsiniz bile bu anda değil – ewomack

+3

Not Mono çalışmak (' 2.10.9'), sen InternalSubset' 'null atanamıyor olarak. Bir 'Info.plist 'parametresini ayrıştırırken/kaydederken, bu bir catch-22'ye yol açar: dosyada' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' '' '' '' yazılır. Boş bir iç altkümeyle 'Info.plist''ün yüklenmesi' [] 'nin yayılmasına neden olur ve' .InternalSubset = null' ayarlanamaz. Ve 'XDocument.DocumentType' salt okunur. Vay benim! – cod3monk3y

+0

Aynı şeyi vurdum (bir Info.plist'i değiştirmek için makroda mono kullanarak). XOCocument ile çalışmayı bitirdikten sonra DOCTYPE'i değiştirmek için XmlDocument kullanarak iyi bir geçici çözüm buldum ve aşağıda yayınladım. Bulamadığım zamana kadar korkunç bir dize değişimi yapmak üzereydim ya da - shudder - XmlReader/XmlWriter. – aggieNick02

7

Eğer Mono üzerinde bununla ilgili varsa (cod3monk3y gibi): Eski sistem bunu işleyemezse Ancak, XDocumentType.InternalSubset mülkiyet null için ayarlayarak DTD'den iç alt kümeyi kaldırabilir Info.plist'i değiştirmeye benzer şekilde, xml dosyanızın oluşturulmasında/değiştirilmesinde XDocument kullanıldıktan sonra işleri düzeltmek için eski XmlDocument sınıfını kullanabilirsiniz.

kodları "Info.plist" dosya yolu infoPlist bulunur varsayar:

using System; 
using System.IO; 
using System.Linq; 
using System.Xml; 
using System.Xml.Linq; 

var xDocument = XDocument.Load (infoPlist); 
// Do your manipulations here 
xDocument.Save (infoPlist); 
XmlDocument xmlDocument = new XmlDocument(); 
xmlDocument.Load (infoPlist); 
if (xmlDocument.DocumentType != null) 
{ 
    var name = xmlDocument.DocumentType.Name; 
    var publicId = xmlDocument.DocumentType.PublicId; 
    var systemId = xmlDocument.DocumentType.SystemId; 
    var parent = xmlDocument.DocumentType.ParentNode; 
    var documentTypeWithNullInternalSubset = xmlDocument.CreateDocumentType(name, publicId, systemId, null); 
    parent.ReplaceChild(documentTypeWithNullInternalSubset, xmlDocument.DocumentType); 
} 
xmlDocument.Save (infoPlist);