XML и & выпуск - PullRequest
       15

XML и & выпуск

2 голосов
/ 03 ноября 2011

Я новичок в XML и сейчас пытаюсь прочитать XML-файл.Я погуглил и попробую этот способ прочитать xml, но получаю эту ошибку.

Ссылка на необъявленную сущность 'Ccaron'.Строка 2902, позиция 9.

Когда я перехожу на строку 2902, я получаю это,

<H0742>&Ccaron;opova 14, POB 1725,
SI-1000 Ljubljana</H0742>

Вот так я пытаюсь

XmlDocument xDoc = new XmlDocument();
xDoc.Load(file);
            XmlNodeList nodes = xDoc.SelectNodes("nodeName");
            foreach (XmlNode n in nodes)
            {
if (n.SelectSingleNode("H0742") != null)
                {
                    row.IrNbr = n.SelectSingleNode("H0742").InnerText;
                }
                .
                .
                .
            }

КогдаЯ смотрю на w3school, и запрещен в xml .

РЕДАКТИРОВАТЬ: Это кодировка.Интересно, это как-то связано с xml.

encoding = 'iso-8859-1'

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Они дали мне файл .ENT , и я могу сослаться на ftp.MyPartnerCompany.com/name.ent.В этом файле .ENT я вижу подобные объекты

<!ENTITY Cacute "&#262;"> <!-- latin capital letter C with acute,
                                  U+0106 Latin Extended-A -->

Как я могу ссылаться на него в моем xml-анализе?Я предпочитаю ссылаться в Интернете, поскольку они могут добавлять новые в любое время.Заранее спасибо !!!

Ответы [ 5 ]

3 голосов
/ 03 ноября 2011

Первое, что нужно знать, это то, что проблема не в вашем программном обеспечении.

Поскольку вы новичок в XML, я собираюсь предположить, что определение сущностей - это не то, с чем вы сталкивались раньше.Символьные объекты - это ярлыки для произвольных фрагментов текста (один или несколько символов).Самое распространенное место, где вы их увидите, - это ситуация, в которой вы находитесь сейчас.В какой-то момент ваш XML был создан кем-то, кто хотел набрать символ «Č» или «č» (это верхний и нижний регистр C с Caron, если ваш шрифт не может его отобразить).

Однаков XML у нас есть только несколько предварительно объявленных объектов (амперсанд, меньше, больше, чем двойная кавычка и апостраф).Любые другие символьные объекты должны быть объявлены.Чтобы правильно проанализировать ваш файл, вам нужно сделать одну из двух вещей - либо заменить символьную сущность чем-то, что не вызывает проблем с анализатором, либо объявить сущность.

Чтобы объявить сущность, вы можете использовать нечто, называемое «внутренним подмножеством» - специализированная форма оператора DTD, которую вы можете увидеть в верхней части вашего XML-файла.Примерно так:

<!DOCTYPE root-element 
   [ <!ENTITY Ccaron "&#x010C;">
     <!ENTITY ccaron "&#x010D;">]
>

Размещение этого оператора в начале XML-файла (измените «корневой элемент» на свой) позволит парсеру разрешить сущность.

В качестве альтернативы просто измените &Ccaron; на &#x010C;, и ваша проблема также будет решена.

Обозначение &# является числовой сущностью, дающей соответствующее значение Юникода для символа («х» означает, что он в шестнадцатеричном виде). ​​

Вы также всегда можете просто ввести символ, но для этого необходимо знать все тонкости вашей клавиатуры и региона.

2 голосов
/ 03 ноября 2011

&Ccaron; не XML, он даже не определен в ссылке на сущность HTML 4. Что кстати не XML. XML не поддерживает все эти сущности, на самом деле, он поддерживает очень немногие из них, но если вы посмотрите на сущность и найдете ее, вы сможете использовать ее Unicode-эквивалент, который вы можете использовать. например &Scaron; неверный XML, но &#352; - нет. (Scaron было ближе всего к Ccaron).

1 голос
/ 03 ноября 2011

&Ccaron; является ссылкой на объект.Вполне вероятно, что ссылка на сущность предназначена для символа Č , чтобы получить: Čopova.

Однако эта сущность должна быть объявлена ​​или синтаксический анализатор XML не будет знать, что следует заменить ссылкой на сущность при анализе XML.

1 голос
/ 03 ноября 2011

Ваш XML-файл неправильно сформирован и поэтому не может использоваться в качестве XmlDocument.Период.

У вас есть два варианта:

  • Открыть этот файл как обычный текстовый файл и устранить этот признак.
  • Исправить генератор XML, и это ваша настоящаяпроблема.Этот генератор не генерирует этот файл с использованием System.Xml, но, вероятно, объединяет несколько строк, так как «XML - это просто текстовый файл».Вы должны исправить это, или открытие сгенерированного файла XML всегда будет сюрпризом.

EDIT : Поскольку вы не можете исправить свой генератор XML, я рекомендую открыть его с помощьюFile.ReadAllText и выполнить регулярное выражение для перекодирования этого & или для удаления всей сущности (как мы не можем перевести)

Console.WriteLine(
    Regex.Replace("<H0742>&Ccaron;opova 14, &#123; POB & SI-1000 &amp;</H0742>",
    @"&((?!#)\S*?;)?", match =>
    {
        switch (match.Value)
        {
            case "&lt;":
            case "&gt;":
            case "&amp;":
            case "&quot;":
            case "&apos;":
                return match.Value; // correctly encoded

            case "&":
                return "&amp;";

            default: // here you can choose:
                // to remove entire entity:
                return "";
                // or just encode that & character
                return "&amp;" + match.Value.Substring(1);
        }
    }));
0 голосов
/ 03 ноября 2011

решение: -

 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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...