XML десериализация строковых элементов с символами новой строки в C # - PullRequest
6 голосов
/ 20 октября 2011

Кажется, я не могу понять, почему этот тест не проходит

Тест:

, учитывая следующий XML:

<?xml version="1.0" encoding="utf-8"?>
  <foo>
<account>
 1234567890
</account>
<deptCode>
 ABCXYZ
</deptCode>
</foo>

иследующий класс:

class Foo  {

  [XmlElement(ElementName = "account", DataType = "normalizedString")]
  string account;

  [XmlElement(ElementName = "deptCode", DataType = "normalizedString"]
  string deptCode;

}

когда этот XML десериализован с помощью:

XmlSerializer serializer = new XmlSerializer(typeof(Foo));
Foo myFoo = (Foo) serializer.Deserialize(xmlReader);

Я получаю следующие значения:

Foo.account = "\r\n 1234567890 \r\n"
Foo.deptCode = "\r\n ABCXYZ \r\n"

вместо ожидаемого

Foo.account = "1234567890"
    Foo.deptCode = "ABCXYZ"

Как я могу сделать так, чтобы процесс десериализации дал мне ожидаемые результаты?Я думал, что DataType="normalizedString" может это сделать, но, похоже, это не дает никакого эффекта, и когда я использую XmlReaderSettings.IgnoreWhitespace, он просто убирает символ "\ r", оставляя мне "\ n 1234567890"

Ответы [ 3 ]

4 голосов
/ 20 октября 2011

Кажется, он работает как задумано.Из IgnoreWhitespace документации:

Пробел, который не считается значимым, включает пробелы, табуляции и пустые строки, используемые для разделения разметки для большей читаемости.

По сути, сохраняет (при установке false) пробелы между элементами, такими как:

<Foo>

<bar>Text</bar>
</Foo>

Новая строка между <Foo>и <bar> будет возвращено читателем.Установите IgnoreWhitespace на true, и это не так.

Чтобы достичь своей цели, вам придется выполнять программную обрезку, как упоминал Кирилл.Когда вы думаете об этом, как читатель должен знать, является ли пробел чистого строкового содержимого элемента (как в ваших примерах) только для целей отступа или реального содержимого?

Для дополнительного чтенияигнорируя пробелы, вы можете взглянуть здесь и здесь .

3 голосов
/ 20 октября 2011

Вы можете создать собственный XmlTextReader класс:

public class CustomXmlTextReader : XmlTextReader
{
    public CustomXmlTextReader(Stream stream) : base(stream) { }

    public override string ReadString()
    {
        return base.ReadString().Trim();
    }
}
1 голос
/ 20 октября 2011

Попробуйте использовать XmlTextReader для десериализации со свойством WhiteSpaceHandling, установленным на WhiteSpaceHandling.None и Normalization = true

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...