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

  • 10 Daughters, 2 Sons

    10 Daughters

    10 Mart 2009
  • filmurfreakur

    filmurfreaku

    29 Mart 2007
  • Jason Parker

    Jason Parker

    14 Aralık 2009