XML Serileştirme için StringWriter Kullanma


99

Şu anda nesneleri seri hale getirmenin kolay bir yolunu arıyorum (C # 3'te).

Google'da bazı örnekler inceledim ve şöyle bir şey buldum:

MemoryStream memoryStream = new MemoryStream ( );
XmlSerializer xs = new XmlSerializer ( typeof ( MyObject) );
XmlTextWriter xmlTextWriter = new XmlTextWriter ( memoryStream, Encoding.UTF8 );
xs.Serialize ( xmlTextWriter, myObject);
string result = Encoding.UTF8.GetString(memoryStream .ToArray());

Bu soruyu okuduktan sonra kendime sordum, neden StringWriter kullanmıyoruz? Çok daha kolay görünüyor.

XmlSerializer ser = new XmlSerializer(typeof(MyObject));
StringWriter writer = new StringWriter();
ser.Serialize(writer, myObject);
serializedValue = writer.ToString();

Başka bir Sorun da, ilk örneğin XML oluşturmasıydı. Sadece SQL Server 2005 DB'nin XML sütununa yazamam.

İlk soru şudur: Daha sonra ona ihtiyaç duyduğumda bir Nesneyi serileştirmek için StringWriter kullanmamam için bir neden var mı? Googling yaparken StringWriter kullanarak bir sonuç bulamadım.

İkincisi, tabii ki: StringWriter ile yapmazsanız (hangi sebeple olursa olsun), hangisi iyi ve doğru bir yol olur?


İlave:

Her iki cevapta da belirtildiği gibi, XML'den DB'ye problemine daha fazla gireceğim.

Veritabanına yazarken şu istisnayı aldım:

System.Data.SqlClient.SqlException: XML ayrıştırma: satır 1, karakter 38, kodlama değiştirilemiyor

Dize için

<?xml version="1.0" encoding="utf-8"?><test/>

XmlTextWriter'dan oluşturulan dizeyi aldım ve oraya xml olarak koydum. Bu işe yaramadı (ne DB'ye manuel olarak yerleştirildiğinde).

Daha sonra kodlama = "utf-16" ile manuel eklemeyi denedim (sadece INSERT INTO yazarak). Kodlamayı kaldırmak o zaman tamamen işe yaradı. Bu sonuçtan sonra StringWriter koduna ve işte geri döndüm - işe yaradı.

Sorun: Nedenini gerçekten anlamıyorum.

Christian Hayter'da: Bu testlerle DB'ye yazmak için utf-16 kullanmam gerektiğinden emin değilim. Kodlamayı UTF-16'ya (xml etiketinde) ayarlamak o zaman işe yaramaz mı?


1
Kişisel deneyime gidiyorum. SQL Server yalnızca UTF-16'yı kabul eder ve başka bir şey iletirseniz, SQL Server XML ayrıştırıcısının ve verileri dönüştürme girişimlerinin insafına kalırsınız. Onu kandırmanın bir yolunu bulmaya çalışmak yerine, doğrudan UTF-16'yı geçtim, bu her zaman işe yarayacak.
Christian Hayter

Bunu veritabanına nasıl yazıyorsun? Bir dizge mi, bayt dizisi mi geçiriyorsunuz, yoksa bir akışa mı yazıyorsunuz? Son iki formdan biri ise, bildirilen kodlamanızın ikili verilerinizin gerçek kodlamasıyla eşleştiğinden emin olmanız gerekir.
Jon Skeet

vay be. MS SQL Management Studio'da Query olarak yaptığım manuel deneme. "Kodlanmış" denemeler bir dizgeye yazılır ve daha sonra dizge olarak yazan bir O / R Eşleştiricisine (izleyebildiğim kadarıyla) iletilir. Aslında sorumda verilen iki örnekte oluşturulan dizgiyi geçiyorum.
StampedeXV


1
Aslında sorumu yanıtladığına inandığım için kabul edilen cevabımı değiştiriyorum. Diğer cevaplar işime devam etmeme yardımcı olsa da, Stackoverflow amacıyla Solomon'un cevabının başkalarının ne olduğunu daha iyi anlamasına yardımcı olacağını düşünüyorum. [Sorumluluk reddi]: Cevabı gerçekten doğrulamak için zaman bulamadım.
StampedeXV

Yanıtlar:


1

<TL; DR> Sorun aslında oldukça basittir: bildirilen kodlamayı (XML bildiriminde) input parametresinin veri türü ile eşleştirmiyorsunuz. Dizeye manuel olarak eklediyseniz , türünün <?xml version="1.0" encoding="utf-8"?><test/>olduğunu bildirmek veya size "kodlama değiştirilemiyor" hatasını verir. Daha sonra, T-SQL aracılığıyla manuel olarak eklerken, bildirilen kodlamayı olarak değiştirdiğiniz için , açıkça bir dize ekliyordunuz (büyük harf "N" ile önek getirilmemiştir, dolayısıyla UTF-8 gibi 8 bit kodlama) ve bir dize değil (büyük harf "N" ile başlar, dolayısıyla 16 bit UTF-16 LE kodlaması).SqlParameterSqlDbType.XmlSqlDbType.NVarCharutf-16VARCHARNVARCHAR

Düzeltme şu kadar basit olmalıydı:

  1. İlk durumda, belirten bildirimi eklerken encoding="utf-8": XML bildirimini eklemeyin.
  2. İkinci durumda, aşağıdaki ifadelerden encoding="utf-16"birini eklerken :
    1. XML bildirimini eklemeyin, VEYA
    2. giriş parametresi türüne basitçe bir "N" ekleyin: :-) SqlDbType.NVarCharyerine SqlDbType.VarChar(veya hatta kullanmaya geçin SqlDbType.Xml)

(Ayrıntılı yanıt aşağıdadır)


Buradaki tüm cevaplar aşırı karmaşık ve gereksizdir (sırasıyla Christian'ın ve Jon'un cevaplarının 121 ve 184'üne bakılmaksızın). Çalışma kodu sağlayabilirler, ancak hiçbiri aslında soruyu yanıtlamaz. Sorun şu ki, soruyu kimse gerçekten anlamadı, bu da sonuçta SQL Server'daki XML veri türünün nasıl çalıştığı ile ilgili. Bu iki açıkça zeki insana karşı bir şey yok, ancak bu sorunun XML'e serileştirmeyle pek ilgisi yok. XML verilerini SQL Server'a kaydetmek, burada ima edilenden çok daha kolaydır.

SQL Server'da XML verilerinin nasıl oluşturulacağına ilişkin kurallara uyduğunuz sürece XML'in nasıl üretildiği gerçekten önemli değildir. Bu sorunun cevabında daha kapsamlı bir açıklamam var (aşağıda özetlenen noktaları göstermek için çalışan örnek kod dahil): XML'i SQL Server'a eklerken "kodlama değiştirilemiyor" hatası nasıl çözülür , ancak temel bilgiler şunlardır:

  1. XML bildirimi isteğe bağlıdır
  2. XML veri türü dizeleri her zaman UCS-2 / UTF-16 LE olarak depolar
  3. XML'iniz UCS-2 / UTF-16 LE ise, o zaman siz:
    1. veriyi NVARCHAR(MAX)ya XML/ SqlDbType.NVarChar(maxsize = -1) ya SqlDbType.Xmlda ya da değişmez bir dize kullanılıyorsa, o zaman büyük harf "N" ile önek olarak verilmelidir.
    2. XML bildirimini belirtiyorsanız, "UCS-2" veya "UTF-16" olmalıdır (burada gerçek bir fark yoktur)
  4. XML'iniz 8 bit olarak kodlandıysa (ör. "UTF-8" / "iso-8859-1" / "Windows-1252"), o zaman siz:
    1. XML bildirimini belirtmeniz gerekir EĞER kodlama, veritabanının varsayılan Harmanlaması tarafından belirtilen kod sayfasından farklıysa
    2. gibi veri geçmelidir VARCHAR(MAX)/ SqlDbType.VarChar(maxsize = 1), ya da hazır sonra bir dizi kullanarak eğer gerekiyor olmayan bir üst-durum "N" öneki ile.
    3. Hangi 8 bit kodlama kullanılırsa kullanılsın, XML bildiriminde belirtilen "kodlama", baytların gerçek kodlamasıyla eşleşmelidir.
    4. 8 bit kodlama, XML veri türü tarafından UTF-16 LE'ye dönüştürülür

Yukarıda özetlenen noktaları göz önünde bulundurarak ve .NET'teki dizelerin her zaman UTF-16 LE / UCS-2 LE olduğu göz önüne alındığında (kodlama açısından bunlar arasında hiçbir fark yoktur), sorularınızı yanıtlayabiliriz:

Daha sonra ona ihtiyaç duyduğumda bir Nesneyi serileştirmek için StringWriter kullanmamam için bir neden var mı?

Hayır, StringWriterkodunuz gayet iyi görünüyor (en azından sorudaki 2. kod bloğunu kullanarak sınırlı testimde herhangi bir sorun görmüyorum).

Kodlamayı UTF-16 (xml etiketinde) olarak ayarlamak o zaman işe yaramaz mı?

XML bildirimini sağlamak gerekli değildir. Eksik olduğunda , dizeyi SQL Server'a NVARCHAR(ie SqlDbType.NVarChar) veya XML(ie SqlDbType.Xml) olarak iletirseniz kodlamanın UTF-16 LE olduğu varsayılır . Olarak iletilirse VARCHAR(yani SqlDbType.VarChar) kodlamanın varsayılan 8 bitlik Kod Sayfası olduğu varsayılır . Herhangi bir standart olmayan ASCII karakteriniz varsa (yani, 128 ve üzeri değerler) ve olarak geçiyorsanız VARCHAR, büyük olasılıkla "?" BMP karakterleri ve "??" için Tamamlayıcı Karakterler için SQL Server, UTF-16 dizesini .NET'ten, UTF-16 / UCS-2'ye dönüştürmeden önce geçerli Veritabanının Kod Sayfasının 8 bitlik bir dizesine dönüştürecektir. Ancak herhangi bir hata almamalısınız.

Eğer XML bildirimi belirtirseniz Öte yandan, o zaman gerekir eşleşen 8-bit veya 16-bit veri türü kullanılarak SQL Server içine geçmektedir. Eğer bir deklarasyon kodlama olduğunu belirten varsa Yani ya UCS-2 veya UTF-16, o zaman gerekir olarak geçmek SqlDbType.NVarCharya SqlDbType.Xml. Veya, kodlama (yani 8 bitlik seçeneklerden biri olduğunu belirten bir bildiri varsa UTF-8, Windows-1252, iso-8859-1, vs), o zaman gerekir olarak geçmek SqlDbType.VarChar. Bildirilen kodlamanın uygun 8 veya 16 bitlik SQL Server veri türü ile eşleştirilmemesi, aldığınız "kodlama değiştirilemiyor" hatasıyla sonuçlanacaktır.

Örneğin, sizin StringWritertabanlı serileştirme kodunuzu kullanarak , XML'nin ortaya çıkan dizesini yazdırdım ve SSMS'de kullandım. Aşağıda görebileceğiniz gibi (çünkü, XML bildirimi dahildir StringWriteriçin bir seçenek yok OmitXmlDeclarationgibi XmlWriterçok uzun doğru SQL Server veri türü olarak dize geçerken hiçbir sorun teşkil yapar):

-- Upper-case "N" prefix == NVARCHAR, hence no error:
DECLARE @Xml XML = N'<?xml version="1.0" encoding="utf-16"?>
<string>Test ሴ😸</string>';
SELECT @Xml;
-- <string>Test ሴ😸</string>

Gördüğünüz gibi , BMP Kod Noktası U + 1234 ve 😸Tamamlayıcı Karakter Kod Noktası U + 1F638 olduğu göz önüne alındığında , standart ASCII'nin ötesindeki karakterleri bile işler . Ancak, aşağıdakiler:

-- No upper-case "N" prefix on the string literal, hence VARCHAR:
DECLARE @Xml XML = '<?xml version="1.0" encoding="utf-16"?>
<string>Test ሴ😸</string>';

aşağıdaki hataya neden olur:

Msg 9402, Level 16, State 1, Line XXXXX
XML parsing: line 1, character 39, unable to switch the encoding

Ergo, tüm bu açıklamalar bir yana, asıl sorunuzun tam çözümü:

İpleri açıkça geçiriyordun SqlDbType.VarChar. Öğesine geçin SqlDbType.NVarCharve XML bildirimini kaldırmanın ekstra adımından geçmeye gerek kalmadan çalışacaktır. Bu, SqlDbType.VarCharXML bildirimini tutmak ve kaldırmak yerine tercih edilir çünkü bu çözüm, XML standart olmayan ASCII karakterler içerdiğinde veri kaybını önleyecektir. Örneğin:

-- No upper-case "N" prefix on the string literal == VARCHAR, and no XML declaration:
DECLARE @Xml2 XML = '<string>Test ሴ😸</string>';
SELECT @Xml2;
-- <string>Test ???</string>

Gördüğünüz gibi bu sefer hata yok ama şimdi veri kaybı var 🙀.


Sanırım bu aşırı karmaşık cevapların nedeni bendim, çünkü temelde bir soruda iki soru vardı. Kısa cevabınızı gerçekten beğendim ve bir dahaki sefere XML'i DB'de saklamak zorunda olduğumda deneyeceğim. Eğer bunu doğru görürsem: XML'i DB'ye depolamanın zorluklarını açıkladınız. Jon Skeet, XML ile çalışırken (UTF-16 hariç) StringWriter kullanımıyla ilgili sorunları özetledi ve Christian Hayter bununla çalışmanın güzel bir yolunu sunuyor.
StampedeXV

@StampedeXV Cevabımı güncelledim (netlik için birkaç değişiklik + noktaları daha iyi göstermek için yeni şeyler). Umarım bu iki cevap da kendi başına iyi olsa da, sorunuzu cevaplamak için hiçbir şekilde gerekli olmadıkları daha açıktır. C # / .NET'te XML serileştirme ile ilgilenirler, ancak bu soru gerçekten XML'in SQL Server'da kaydedilmesiyle ilgilidir. Bilmekte fayda var ve başlangıçta sağladığınızdan daha iyi kod olabilecek bilgiler sağlarlar, ancak hiçbiri (ne de buradaki diğerlerinden hiçbiri) gerçekten konu üzerine değildir. Ancak bu iyi belgelenmiş şeyler değil, dolayısıyla kafa karışıklığı.
Solomon Rutzky

@StampedeXV Revizyonlarım mantıklı geldi mi? En üste daha net olabilecek bir özet bölümü ekledim. Uzun lafın kısası: Soruda ayrıntılarını eklemediğiniz başka bir şey olmadıkça, kodunuz% 99 doğru görünüyor ve muhtemelen tek bir büyük harf eklenerek düzeltilebilirdi " N ". Özel bir kodlama malzemesine gerek yoktur ve Christian'ın kodu güzeldir, ancak benim testim gösteriyor ki sizin 2. kod bloğunuzla aynı olan serileştirmeyi döndürüyor, sizinki XML bildiriminden sonra bir CRLF koyuyor. Bahse girerim SqlDbType.NVarCharveya olarak değişmişsindir Xml.
Solomon Rutzky

Hala kendim kontrol etmek için zaman bulmaya çalışıyorum. Kulağa kesinlikle iyi ve mantıklı geliyor, ancak bunun kabul edilen bir cevabı değiştirmek için yeterli olacağından emin değil.
StampedeXV

218

StringWriterBununla ilgili bir sorun, varsayılan olarak reklamını yaptığı kodlamayı ayarlamanıza izin vermemesidir - böylece kodlamasını UTF-16 olarak tanıtan bir XML belgesine sahip olabilirsiniz; bir dosyaya yazın. Yine de yardımcı olacak küçük bir sınıfım var:

public sealed class StringWriterWithEncoding : StringWriter
{
    public override Encoding Encoding { get; }

    public StringWriterWithEncoding (Encoding encoding)
    {
        Encoding = encoding;
    }    
}

Veya yalnızca UTF-8'e ihtiyacınız varsa (ki bu genellikle ihtiyacım olan şeydir):

public sealed class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding => Encoding.UTF8;
}

XML'nizi neden veritabanına kaydedemediğinize gelince - teşhis edebilmemizi / düzeltmemizi istiyorsanız, denediğinizde ne olduğu hakkında bize daha fazla ayrıntı vermeniz gerekecektir.


Şimdi veritabanı sorunu için daha fazla ayrıntıya girdim. Soruya bakın.
StampedeXV

4
Ne yazık ki StringWriter, kodlamayı hesaba katmıyor, ama asla azını değil, şık küçük bir yöntem için teşekkürler :)
Chau

2
Ve "XML ayrıştırma: satır 1, karakter 38, kodlamayı değiştiremiyor", "settings.Indent = false; settings.OmitXmlDeclaration = false;" ile çözülebilir
MGE

Bunu genellikle doğru kodlamayla a MemoryStreamve a kullanarak StreamWriterçözerim. StreamWriter olan bir TextWriter(tip XmlWriter.CreateSonuçta, özelleştirilebilir kodlama ile bekler).
Nyerguds

2
@Nyerguds: Bu tür şeylerle bir Nuget paketi oluşturun, o zaman ulaşmak her zaman kolaydır. Temelde başka bir gereksinimle ilgili olan kodun okunabilirliğinden ödün vermektense bunu yapmayı tercih ederim.
Jon Skeet

126

Bir XML belgesini bir .NET dizesine serileştirirken, kodlama UTF-16 olarak ayarlanmalıdır. Dizeler dahili olarak UTF-16 olarak saklanır, bu nedenle mantıklı olan tek kodlama budur. Verileri farklı bir kodlamada saklamak istiyorsanız, bunun yerine bir bayt dizisi kullanırsınız.

SQL Server da benzer bir ilkeyle çalışır; bir xmlsütuna aktarılan herhangi bir dizge UTF-16 olarak kodlanmalıdır. SQL Server, XML bildiriminin UTF-16'yı belirtmediği herhangi bir dizeyi reddeder. XML bildirimi yoksa, XML standardı varsayılan olarak UTF-8 olmasını gerektirir, bu nedenle SQL Server bunu da reddeder.

Bunu akılda tutarak, dönüştürme yapmak için bazı yardımcı yöntemler aşağıda verilmiştir.

public static string Serialize<T>(T value) {

    if(value == null) {
        return null;
    }

    XmlSerializer serializer = new XmlSerializer(typeof(T));

    XmlWriterSettings settings = new XmlWriterSettings()
    {
        Encoding = new UnicodeEncoding(false, false), // no BOM in a .NET string
        Indent = false,
        OmitXmlDeclaration = false
    };

    using(StringWriter textWriter = new StringWriter()) {
        using(XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings)) {
            serializer.Serialize(xmlWriter, value);
        }
        return textWriter.ToString();
    }
}

public static T Deserialize<T>(string xml) {

    if(string.IsNullOrEmpty(xml)) {
        return default(T);
    }

    XmlSerializer serializer = new XmlSerializer(typeof(T));

    XmlReaderSettings settings = new XmlReaderSettings();
    // No settings need modifying here

    using(StringReader textReader = new StringReader(xml)) {
        using(XmlReader xmlReader = XmlReader.Create(textReader, settings)) {
            return (T) serializer.Deserialize(xmlReader);
        }
    }
}

Soru eklemeye bakın. Test sonuçlarımı anlamıyorum , DB'nin her zaman UTF-16 istediği / aldığı / buna ihtiyaç duyduğu şeklindeki ifadenizle çelişiyor gibi görünüyor .
StampedeXV

9
Sen yok UTF-16 olarak kodlamak zorunda - ancak emin olmak gerekiyor ki bunu maçlar neyi kullanmak kodlayan StringWriterbekler. Cevabımı gör. Dahili depolama biçimi burada önemsizdir.
Jon Skeet

tamam anladım. Yeni örneğimde: kodlamayı tamamen dışarıda bırakmak, DB'nin hangi kodlamanın kullanıldığına kendisi karar vermesini sağladı - bu yüzden işe yaradı. Şimdi doğru anlıyor muyum?
StampedeXV

1
@SteveC: Üzgünüm, benim hatam. Kodu Nothing, dolaylı olarak herhangi bir türe dönüştürülebilen VB'den elle dönüştürdüm . DeserializeKodu düzelttim . SerializeUyarı, Resharper-tek şey, karşı çıkmazsa kendi başına derleyici olmalı ve bunu yapmak yasaldır.
Christian Hayter

1
Jon Skeet'in yorumuna dayanarak hayır, UTF-16 gerekli değildir. Bunu gösteren somut bir örnek için lütfen stackoverflow.com/a/8998183/751158 adresine bakın .
ziesemer

20

Her şeyden önce eski örnekler bulmaya dikkat edin. XmlTextWriter.NET 2.0'dan itibaren kullanımdan kaldırılan kullanan bir tane buldunuz. XmlWriter.Createbunun yerine kullanılmalıdır.

Bir nesneyi XML sütununda serileştirmenin bir örneğini burada bulabilirsiniz:

public void SerializeToXmlColumn(object obj)
{
    using (var outputStream = new MemoryStream())
    {
        using (var writer = XmlWriter.Create(outputStream))
        {
            var serializer = new XmlSerializer(obj.GetType());
            serializer.Serialize(writer, obj);
        }

        outputStream.Position = 0;
        using (var conn = new SqlConnection(Settings.Default.ConnectionString))
        {
            conn.Open();

            const string INSERT_COMMAND = @"INSERT INTO XmlStore (Data) VALUES (@Data)";
            using (var cmd = new SqlCommand(INSERT_COMMAND, conn))
            {
                using (var reader = XmlReader.Create(outputStream))
                {
                    var xml = new SqlXml(reader);

                    cmd.Parameters.Clear();
                    cmd.Parameters.AddWithValue("@Data", xml);
                    cmd.ExecuteNonQuery();
                }
            }
        }
    }
}

2
Buna yalnızca bir kez oy verebilirim, ancak buradaki en iyi cevap bu olmayı hak ediyor. Sonuç olarak, XmlReaderayrıştırabildiği sürece hangi kodlamanın bildirildiği veya kullanıldığı önemli değildir . Veritabanına önceden ayrıştırılmış olarak gönderilir ve ardından DB'nin karakter kodlamaları hakkında UTF-16 veya başka bir şey bilmesi gerekmez. Özellikle, eklemek için hangi yöntemin kullanıldığına bakılmaksızın, XML bildirimlerinin veritabanındaki verilerle birlikte kalıcı olmadığını unutmayın. Lütfen burada ve başka yerlerde diğer yanıtlarda gösterildiği gibi fazladan dönüştürmeler yoluyla XML çalıştırarak israf etmeyin.
ziesemer

1
public static T DeserializeFromXml<T>(string xml)
{
    T result;
    XmlSerializerFactory serializerFactory = new XmlSerializerFactory();
    XmlSerializer serializer =serializerFactory.CreateSerializer(typeof(T));

    using (StringReader sr3 = new StringReader(xml))
    {
        XmlReaderSettings settings = new XmlReaderSettings()
        {
            CheckCharacters = false // default value is true;
        };

        using (XmlReader xr3 = XmlTextReader.Create(sr3, settings))
        {
            result = (T)serializer.Deserialize(xr3);
        }
    }

    return result;
}

-1

Başka bir yerde ele alınmış olabilir, ancak XML kaynağının kodlama satırını 'utf-16' olarak değiştirmek, XML'in bir SQL Server 'xml' veri türüne eklenmesine izin verir.

using (DataSetTableAdapters.SQSTableAdapter tbl_SQS = new DataSetTableAdapters.SQSTableAdapter())
{
    try
    {
        bodyXML = @"<?xml version="1.0" encoding="UTF-8" standalone="yes"?><test></test>";
        bodyXMLutf16 = bodyXML.Replace("UTF-8", "UTF-16");
        tbl_SQS.Insert(messageID, receiptHandle, md5OfBody, bodyXMLutf16, sourceType);
    }
    catch (System.Data.SqlClient.SqlException ex)
    {
        Console.WriteLine(ex.Message);
        Console.ReadLine();
    }
}

Sonuç, XML metninin tamamı 'xml' veri türü alanına eklenir, ancak 'başlık' satırı kaldırılır. Ortaya çıkan kayıtta gördüğünüz şey sadece

<test></test>

"Yanıtlandı" girişinde açıklanan serileştirme yöntemini kullanmak, orijinal başlığı hedef alana dahil etmenin bir yoludur, ancak sonuç, kalan XML metninin bir XML <string></string>etiketi içine alınmasıdır .

Koddaki tablo bağdaştırıcısı, Visual Studio 2013 "Yeni Veri Kaynağı Ekle: sihirbazı kullanılarak otomatik olarak oluşturulmuş bir sınıftır. Bir SQL Server tablosundaki alanlara ekleme yöntemi eşlemesinin beş parametresi.


2
Değiştirilsin mi? Bu komik.
mgilberties

2
Cidden - bunu yapma. Hiç. Ya xml'ime "UTF-8" den bahseden bir yazı eklemek istersem - verilerimi henüz söylemediğim bir şeye değiştirdiniz!
Tim Abell

2
Koddaki bir hatayı işaret ettiğiniz için teşekkürler. BodyXML.Replace ("UTF-8", "UTF-16") yerine UTF-8'i UTF-16 olarak değiştiren XML başlığına odaklanan bir kod olmalıdır. Aslında belirtmeye çalıştığım şey, kaynak XML'in başlığında bu değişikliği yaparak, XML'in gövdesi daha sonra bir XML veri türü alanı kullanılarak bir SQL tablo kaydına eklenebilir ve başlık çıkarılır. Şimdi hatırlamadığım nedenlerle (dört yıl önce!) Sonuç o zamanlar yararlı bir şeydi. Ve evet, 'Değiştir'i kullanarak aptalca bir hata. Olur.
DLG
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.