powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# XML Лишние пробелы
16 сообщений из 16, страница 1 из 1
C# XML Лишние пробелы
    #38466985
Frisker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, в общем такая проблема, работаю с xml через
Код: c#
1.
XMLDocument

, при сохранении этого "документа", происходит такая вещь:
Оригинал:
Код: xml
1.
<Name></Name>


После сохранения doc.Save(path);
Код: xml
1.
2.
<Name>
</Name>


Как убрать лишние пробелы? Пробовал
Код: c#
1.
doc.PreserveWhitespace = true; 

перед сохранением и перед загрузкой. Результат не тот, удаляет все пробелы. XML документ(большого объёма) становиться визуально нечитаемым.
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38467241
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frisker,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
            var xmlDoc = new XmlDocument();
            xmlDoc.LoadXml("<root><item1></item1><item2></item2></root>");
            
            using (var stream = new MemoryStream())
            {
                var settings = new XmlWriterSettings()
                {
                    Indent = true,
                    Encoding = new UTF8Encoding(false)
                };

                XmlWriter xmlWriter = XmlWriter.Create(stream, settings);
                xmlDoc.Save(xmlWriter);


                Console.WriteLine(new UTF8Encoding(false).GetString(stream.ToArray(), 0, (int) stream.Length));
            }
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38467299
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frisker,
XML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
<root>
  <folder id="1">
    <folder id="2">
      <folder id="4">
        <folder id="5">
          <folder id="6">
            <item id="7" />
            <foo>ЫёФЯжю! ®©?</foo>
          </folder>
        </folder>
      </folder>
      <text></text>
      <!-- some comment -->
      <item id="100"/>
      <item id="8"/><item id="88"                         />   <item id="99"/>
      <item
        id="200"/><item id="300"/><item
                                        id="400"/>
      
      
      <item
        id="500"/>
    </folder>
    <bar>
      <![CDATA[
        some loooooong text
      ]]>
    </bar>
    <folder id="9">
      <item id="10" />
    </folder>
  </folder>
</root>


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var xd = new XmlDocument {PreserveWhitespace = true};
using (var sr = new StringReader(Properties.Resources.Items))
using (var xr = XmlReader.Create(sr))
  xd.Load(xr);
var sb = new StringBuilder();
using (var sw = new StringWriter(sb))
using (var xw = XmlWriter.Create(sw, new XmlWriterSettings { OmitXmlDeclaration = true }))
  xd.Save(xw);
Console.WriteLine(sb.ToString());


Результат
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
<root>
  <folder id="1">
    <folder id="2">
      <folder id="4">
        <folder id="5">
          <folder id="6">
            <item id="7" />
            <foo>ЫёФЯжю! ®©?</foo>
          </folder>
        </folder>
      </folder>
      <text></text>
      <!-- some comment -->
      <item id="100" />
      <item id="8" /><item id="88" />   <item id="99" />
      <item id="200" /><item id="300" /><item id="400" />


      <item id="500" />
    </folder>
    <bar>
      <![CDATA[
        some loooooong text
      ]]>
    </bar>
    <folder id="9">
      <item id="10" />
    </folder>
  </folder>
</root>


- пробельные узлы все на месте. Полностью сохранить форматирование не получится, т.к. XML - это не текст для чтения человеком, а формат хранения/передачи данных, внутреннее представление которого не имеет ничего общего с читаемым текстом; при парсинге происходит нормализация нод (например, выкидываются пробелы внутри элементов). Можно задать опеределенный формат для вывода - см. класс XmlWriterSettings, но нельзя сохранить произвольное исходное форматирование.
И да, желание читать XML-документы (тем более большого формата) так же странно, как читать результат от BinaryFormatter.
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38467643
Frisker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны, да, я понимаю, что это не "текстик для чтения", но фишка в чём, простое сохранение добавляет пробелы в пустые узлы/теги, это xml служит для загрузки в базу, а при загрузке в неё ругается на эти пробелы....
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38467655
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Friskerа при загрузке в неё ругается на эти пробелы....
Как выполняете загрузку, и в какую базу? Описанное в случае MSSQL возможно только при загрузке через bcp или BULK INSERT, но это всё разруливается файлом формата загрузки.
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38468975
Frisker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны,

Юзвери со стороны выгружают со своей базы (с ошибками), наши же не могут загрузить их в нашу базу (db2)...
Всем спасибо за помощь, решение найдено
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38468983
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Friskerрешение найдено

Так выложите его сюда. Пусть и другие посмотрят.
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38469051
Frisker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

Только сильно не смеяться....
Код: c#
1.
2.
3.
4.
5.
6.
7.
string filename=@"Test.xml";
XmlDocument doc = new Xmldocument();
doc.Load(Filename);
//Тут какие то операции производятся
doc.Save(Filename);
XDocument xml = XDocument.Load(filename, LoadOptions.None);
xml.Save(filename);


P.S. Никогда, никогда не используйте XmlDocument, только XDocument.
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38469076
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frisker,

грузить документ и снова сохранять выглядит некрасиво. Попробуй вот так сохранять:
Код: c#
1.
2.
3.
4.
5.
XmlWriterSettings xws = new XmlWriterSettings { Indent = true };
using (XmlWriter xw = XmlWriter.Create(filename, xws))
{
	doc.Save(xw);
}
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38469083
Frisker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bazileFrisker,

грузить документ и снова сохранять выглядит некрасиво. Попробуй вот так сохранять:
Код: c#
1.
2.
3.
4.
5.
XmlWriterSettings xws = new XmlWriterSettings { Indent = true };
using (XmlWriter xw = XmlWriter.Create(filename, xws))
{
	doc.Save(xw);
}


пробовал, тот же самый эффект. Я много способов перепробывал, остановился на своём варианте.
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38469321
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FriskerP.S. Никогда, никогда не используйте XmlDocument, только XDocument.
С какого это перепугу?
P.S. XmlDocument вовсе необязательно сохранять в промежуточный файл для создания XDocument, второй из первого можно получить вот так:
Код: c#
1.
2.
3.
4.
public static XDocument ToXDocument(this XmlDocument xmldoc)
{
  return XDocument.Load(xmldoc.CreateNavigator().ReadSubtree());
}


Я много способов перепроб ы вал, остановился на своём варианте.
У вас явно косяк в том, что вы не привели. Т.к. XmlWriter с XmlWriterSettings по умолчанию при сериализации в строку выкидывает все пробельные узлы:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var xStr = @"
<root>
  <node id='1'>
    <text></text>
  </node>
</root>
";
var xd = new XmlDocument();
xd.LoadXml(xStr);
var sb = new StringBuilder();
using(var sw = new StringWriter(sb))
using(var xw = XmlWriter.Create(sw))
  xd.Save(xw);
Console.WriteLine(sb);


На выводе:
Код: plaintext
<?xml version="1.0" encoding="utf-16"?><root><node id="1"><text></text></node></root>

Это во-первых. Во-вторых, заливать XML в базу как строчные данные - решение, мягко говоря, странное. Как-то не верится, что у DB2 нет способа заливать типизированные данные - т.е. уже разобранное DOM-дерево. В MSSQL для этого используют тип SqlXml.
Посмотрите на примеры вот здесь - практически во всех примерах фигурирует XML c пробельными узлами.
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38469322
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(примеры вот здесь )
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38470406
Frisker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны,
Спасибо за помощь. В базу загружаю не я, я вообще понятия не имею что в неё на пичкано и как и на чем написан был к ней интерфейс, так как нету доступа. Я всего лишь "маленькое звено" в огромной системе.
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38473579
Диам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Точно такая же проблема: исходный XML не содержит пробельных узлов:
Код: xml
1.
2.
3.
<buildingNumber>189</buildingNumber>
<cooperativeCode/>
<flatNumber/>



После чтения и сохранения, даже по методу Frisker`а
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Dim doc As New XmlDocument()
Dim docX As New XDocument

doc.Load('pathA')
doc.Save('pathB')
docX = XDocument.Load('pathB', LoadOptions.None)
docX.Save('pathC')



результат ('pathC') все равно содержит пробелы
Код: xml
1.
2.
3.
<buildingNumber>189</buildingNumber>
<cooperativeCode />
<flatNumber />



Конечный результат очень важен, т.к. этот текст должен подписываться цифровой подписью
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38473699
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диамисходный XML не содержит пробельных узлов:
Переносы строк между узлами в текстовом представлении - это тоже whitespace nodes, так что содержит.
Диамрезультат ('pathC') все равно содержит пробелы
Где? между окончанием имени тэга и самозакрывающим слэшем? Это стандартное форматирование парсера, от него вы не избавитесь, т.к. еще раз: XML - это не текст, а структура данных, и её текстовое представление - дело сугубо пятое. Либо используйте везде стандартное форматирование, задаваемое через XmlWriterSettings, либо используйте другой формат - например, бинарную сериализацию, и помещение её результата в виде base64 в CDATA, цифровой подписью подписывать результат CDATA.
Если же про переносы строк между узлами - не пользуйтесь методом XmlDocument.Save(filename), используйте перегрузку XmlDocument.Save(xmlWriter).
...
Рейтинг: 0 / 0
C# XML Лишние пробелы
    #38473810
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиамКонечный результат очень важен, т.к. этот текст должен подписываться цифровой подписью

Ерунда какая то. Почему это он важен,и как связана с ним ЭЦП? ЭЦП гарантирует целостность ОТПРАВЛЕННЫХ данных. Так что неважно, какой там у вас XML - с пробелами или нет. Это набор байтов.

Так что на второй стороне проверкой ЭЦП УБЕЖДАЮТСЯ, что некий набор байтов по пути не поврежден. А уж как его интерпретировать - на это ЭЦП не влияет.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# XML Лишние пробелы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]