C # LINQ to XML отсутствует пробел - PullRequest
4 голосов
/ 29 апреля 2010

Я пишу XML-файл «вручную» (т.е. не с помощью LINQ to XML), который иногда включает в себя тег открытия / закрытия, содержащий один пробел. После просмотра полученного файла все выглядит правильно, пример ниже ...

<Item>
  <ItemNumber>3</ItemNumber>
  <English> </English>
  <Translation>Ignore this one. Do not remove.</Translation>
</Item>

... причины для этого разнообразны и неуместны, это сделано.

Позже я использую программу на C # с LINQ to XML, чтобы прочитать файл обратно и извлечь запись ...

XElement X_EnglishE = null;  // This is CRAZY
foreach (XElement i in Records)
{
    X_EnglishE = i.Element("English");  // There is only one damned record!
}
string X_English = X_EnglishE.ToString();

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

+E+ Text[3] English source has been altered:
    Was: >>> <<<
    Now: >>><<<

... части >>> и <<<, которые я добавил, чтобы увидеть, что происходит, (трудно увидеть пробелы). Я возился с этим, но не понимаю, почему это так. Это не совсем критично, так как поле не используется (пока), но я не могу доверять C # или LINQ или тому, что делает это, если я не понимаю, почему это так. Так, что делает это и почему? </p>

Ответы [ 3 ]

2 голосов
/ 29 апреля 2010

В XML Пробелы (например, пробел) игнорируются после и до тегов. Анализируемый XML игнорирует этот единственный пробел, потому что он рассматривается как форматирование (так как нет текста вокруг него), и поэтому он не отображается в ваших выходных данных.

2 голосов
/ 29 апреля 2010

Вам нужно сохранить пробелы при загрузке строки XML:

XDocument doc = XDocument.Parse(@"
<Item>
    <ItemNumber>3</ItemNumber>
    <English> </English>
    <Translation>Ignore this one. Do not remove.</Translation>
</Item>", LoadOptions.PreserveWhitespace);

string X_English = (string)doc.Root.Element("English");

//  X_English == " "
2 голосов
/ 29 апреля 2010

Мне кажется, что это то же самое, что и поведение, которое вы получаете в HTML, когда начальные / конечные пробелы складываются в себя, в результате чего вы получаете пустую строку. Я думаю, что если вы поместите один пробел в блок CDATA, это может разрешить его.

...