SORU
22 Kasım 2008, CUMARTESİ


Neden C# XmlDocument.LoadXml(dizi) bir XML başlık dahil olduğunda başarısız?

Herkes aşağıdaki kod örneği, bir XmlException ile "kök düzeyindeki Veriler geçersiz. neden başarısız bir fikrin var mı Satır 1, konum 1."

var body = "<?xml version="1.0" encoding="utf-16"?><Report> ......"
XmlDocument bodyDoc = new XmlDocument();            
bodyDoc.LoadXml(body);

CEVAP
23 HAZİRAN 2009, Salı


Arka plan

Ancak soru mu var kodlama kümesi olarak UTF-16 gerek yok dize doğru kaçtı o kadar emin değildim eğer bu doğruysa, aslında, doğru devrik dize halinde soru.

Aynı durum ile karşılaştım:

Sistem.Xml.XmlException: Veri kök düzeyinde geçersiz. Hat 1, pozisyon 1.

Ancak, benim kod bu gibi görünüyor.

string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<event>This is a Test</event>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);

Sorun

Sorun dizeleri DAHİLİ olarak UTF-16 olarak saklanır .Ancak NET kodlama XML belge Başlığı belirtilen farklı olabilir. E. g.:

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

here Dize: TechNet belgelerine

Bir dize her Unicode karakter Unicode rakamsal bir değer tarafından tanımlanan ayrıca bir Unicode kod noktası denir (sayısal) sıra değeri Unicode karakter. Her kod noktası kodlama UTF-16 kodlanmış kullanarak, ve her bir elemanın sayısal değeri kodlama bir karakter tarafından temsil edilir nesne.

Bu XmlDocument zaman geçirmek anlamına gelir.() LoadXml XML başlığı ile dize, kodlama UTF-16 olduğunu söylemek gerekir. Aksi halde, gerçek temel kodlama kodlama başlığındaki bildirdi uyuşmaz ve bir XmlException atılan neden olur.

Çözüm

Bu sorun için çözüm kodlama ne olursa olsun Yük veya LoadXml yöntemini geçirmek kullanılan XML başlığında senin dediğin aynı olduğundan emin olun. Yukarıda benim örnekte, XML, UTF-16 devlete veya UTF-8 giriş kodlamak için başlığı değiştirmek ve kullanmak XmlDocument.Load methods birini.

Örnek kod, bir XmlDocument UTF-8 kodlamak XML belgesini tanımlayan bir dize kullanarak (ama tabii ki, UTF-16 saklanır .inşa etmek için bir MemoryStream nasıl kullanılacağını gösteren aşağıdadır NET dize).

string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<event>This is a Test</event>";

// Encode the XML string in a UTF-8 byte array
byte[] encodedString = Encoding.UTF8.GetBytes(xml);

// Put the byte array into a stream and rewind it to the beginning
MemoryStream ms = new MemoryStream(encodedString);
ms.Flush();
ms.Position = 0;

// Build the XmlDocument from the MemorySteam of UTF-8 encoded bytes
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(ms);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 07cadikiz07

    07cadikiz07

    17 EKİM 2007
  • Jeremy Gallman

    Jeremy Gallm

    11 NİSAN 2012
  • Jonathan D.

    Jonathan D.

    3 Kasım 2006