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

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


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


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

перед сохранением и перед загрузкой. Результат не тот, удаляет все пробелы. XML документ(большого объёма) становиться визуально нечитаемым.
...
Рейтинг: 0 / 0
16.11.2013, 12:45
    #38467241
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# XML Лишние пробелы
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
16.11.2013, 15:16
    #38467299
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# XML Лишние пробелы
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
17.11.2013, 10:19
    #38467643
Frisker
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# XML Лишние пробелы
Сон Веры Павловны, да, я понимаю, что это не "текстик для чтения", но фишка в чём, простое сохранение добавляет пробелы в пустые узлы/теги, это xml служит для загрузки в базу, а при загрузке в неё ругается на эти пробелы....
...
Рейтинг: 0 / 0
17.11.2013, 11:01
    #38467655
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# XML Лишние пробелы
Friskerа при загрузке в неё ругается на эти пробелы....
Как выполняете загрузку, и в какую базу? Описанное в случае MSSQL возможно только при загрузке через bcp или BULK INSERT, но это всё разруливается файлом формата загрузки.
...
Рейтинг: 0 / 0
18.11.2013, 18:05
    #38468975
Frisker
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# XML Лишние пробелы
Сон Веры Павловны,

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

Так выложите его сюда. Пусть и другие посмотрят.
...
Рейтинг: 0 / 0
18.11.2013, 18:59
    #38469051
Frisker
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# XML Лишние пробелы
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
18.11.2013, 19:19
    #38469076
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# XML Лишние пробелы
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
18.11.2013, 19:25
    #38469083
Frisker
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# XML Лишние пробелы
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
19.11.2013, 06:12
    #38469321
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# XML Лишние пробелы
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
19.11.2013, 06:13
    #38469322
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# XML Лишние пробелы
(примеры вот здесь )
...
Рейтинг: 0 / 0
19.11.2013, 19:28
    #38470406
Frisker
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# XML Лишние пробелы
Сон Веры Павловны,
Спасибо за помощь. В базу загружаю не я, я вообще понятия не имею что в неё на пичкано и как и на чем написан был к ней интерфейс, так как нету доступа. Я всего лишь "маленькое звено" в огромной системе.
...
Рейтинг: 0 / 0
21.11.2013, 23:19
    #38473579
Диам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# XML Лишние пробелы
Здравствуйте. Точно такая же проблема: исходный 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
22.11.2013, 06:23
    #38473699
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# XML Лишние пробелы
Диамисходный XML не содержит пробельных узлов:
Переносы строк между узлами в текстовом представлении - это тоже whitespace nodes, так что содержит.
Диамрезультат ('pathC') все равно содержит пробелы
Где? между окончанием имени тэга и самозакрывающим слэшем? Это стандартное форматирование парсера, от него вы не избавитесь, т.к. еще раз: XML - это не текст, а структура данных, и её текстовое представление - дело сугубо пятое. Либо используйте везде стандартное форматирование, задаваемое через XmlWriterSettings, либо используйте другой формат - например, бинарную сериализацию, и помещение её результата в виде base64 в CDATA, цифровой подписью подписывать результат CDATA.
Если же про переносы строк между узлами - не пользуйтесь методом XmlDocument.Save(filename), используйте перегрузку XmlDocument.Save(xmlWriter).
...
Рейтинг: 0 / 0
22.11.2013, 09:58
    #38473810
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# XML Лишние пробелы
ДиамКонечный результат очень важен, т.к. этот текст должен подписываться цифровой подписью

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

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


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