Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

​Чем читать Кристал-Репорт.хмл?

164  
Murr патриот15.06.18 11:28
Murr
15.06.18 11:28 

Чем читать Кристал-Репорт.хмл?


Клиент не смог конвертировать свою внутреннюю документацию с нормальный ЦСВ-файл

и желает присылать данные в виде кристал-репортовского хмла.


Наворочено там... много.

Могу сделать тремя вариантами:

- слепить хслт и трансформировать документ во что-то цсв-лике

- читать как ХМЛ-документ и выдергивать нужное хпатхьом

- написать реадер с имеющимися в документе обьектами.


Плюсы и минусы каждого варианта - понятны.


Вопросик: А нет ли какой уже написанной либы для чтения этих репортоv?

#1 
Murr патриот20.06.18 10:28
Murr
NEW 20.06.18 10:28 
в ответ Murr 15.06.18 11:28

Почитал кучку информации на разных форумах.

Наиболее подходящим вариантом выглядит следующий:

- инсталировать последний рун-тиме для САП КристалРепорт.

- после инсталляции использовать CrystalDecisions.CrystalReports.Engine.dll


Поиски на просторах инета позволили отыскать свеженький рун-тиме.

Инсталляция тоже прошла без проблем.


Результат: файлов CrystalDecisions.CrystalReports.* в системе нет.


Разархивировал рун-тиме - файлы в наличии имеются.


Вопрос - что Я делаю не так кликая по имеющимся кнопкам? безум

#2 
Murr патриот20.06.18 18:41
Murr
NEW 20.06.18 18:41 
в ответ Murr 20.06.18 10:28

Нашлись файлы где-то в ГАКе.


Понятнее как читать присланный документ - не стало.


Попутно выяснилось что писать Хмл Я таки тоже не умею.


Как правильно прописать намеспасы в ДокументЕлемент?

Делал так


pXmlWriter.WriteStartElement(ElementName, XmlNs);

pXmlWriter.WriteAttributeString(XmlNs, "bam:value");


отваливается с невозможностью заменить пустую строку на значение XmlNs...


#3 
Murr патриот20.06.18 21:21
Murr
NEW 20.06.18 21:21 
в ответ Murr 20.06.18 18:41

На завтра...

/*

//

// следующий код записывал намеспайсы, которые записываются

// по умолчанию стандартным XmlSerializer

// более не требуется поскольку вывод стандартного серализатора

// подавлен

//

aXmlWriter.WriteStartAttribute("xmlns:xsi");

aXmlWriter.WriteString("http://www.w3.org/2001/XMLSchema-instance");

aXmlWriter.WriteEndAttribute();

aXmlWriter.WriteStartAttribute("xmlns:xsd");

aXmlWriter.WriteString("http://www.w3.org/2001/XMLSchema");

aXmlWriter.WriteEndAttribute();

*/

#4 
Murr патриот21.06.18 11:43
Murr
NEW 21.06.18 11:43 
в ответ Murr 20.06.18 21:21

Пока не победил следующее:


требуется писать хмл-документ со всеми намеспасами.

<?xml version="1.0" encoding="UTF-8"?>
< FormattedReport xmlns="urn:crystal-reports:schemas" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" >
...

При создании вритера (XmlWriter, XmlTextWritter) xmlns

является обязательным и предопределенным элементом.


При попытке записать аттрибут с именем хмлнс вритер ругается на неправильность и/или невозможность переопределения хмлнс.


Есть вариант подавить это дело используя Сериализер, но интересует решение с вритером.


Есть какие идеи как покоцать вритер до понимания им нового значения хмлнс?



Ошибка при записи

Test Name: MicrosoftExample_WriteAttributeString_4

Test FullName: Tests.MicrosoftExample_WriteAttributeString_4

Test Source: TFormattedReport.cs : line 50

Test Outcome: Failed

Test Duration: 0:00:10.5859899

Result StackTrace:

at System.Xml.XmlWellFormedWriter.PushNamespaceExplicit(String prefix, String ns)

at System.Xml.XmlWellFormedWriter.WriteEndAttribute()

at Tests.MicrosoftExample_WriteAttributeString_4() in TFormattedReport.cs:line 70

Result Message:

Test method Tests.TFormattedReport_Tests.MicrosoftExample_WriteAttributeString_4 threw exception:

System.Xml.XmlException: The prefix '' cannot be redefined from '' to 'urn_book' within the same start element tag.



#5 
Murr патриот21.06.18 11:54
Murr
NEW 21.06.18 11:54 
в ответ Murr 21.06.18 11:43

Поторопился...

Есть решение для такого варианта.


char[] splitters = new Char[] { ':' };

void IXmlSerializable.WriteXml(XmlWriter pXmlWriter)
{
string xmlns = attributes[XmlNs];
pXmlWriter.WriteStartElement(ElementName, xmlns); // element name and value for xmlns
foreach(KeyValuePair<string,string> kvp in attributes)
{
string[] splitted = kvp.Key.Split(splitters);
if (splitted.Length == 1)
pXmlWriter.WriteAttributeString(XmlNs, kvp.Value);
else
pXmlWriter.WriteAttributeString(splitted[0], splitted[1], null, kvp.Value);
}
pXmlWriter.WriteFullEndElement();

}

Не полное, но мне хватит...

#6 
Murr патриот22.06.18 17:34
Murr
NEW 22.06.18 17:34 
в ответ Murr 21.06.18 11:54

А кому-нибудь встречалась FormattedReport.xsd?


Написать - написал. Работает.

Не нравится то, что нет гарантии на то, что будет работать с любыми подобными документами.


Отсюда вопрос - кто-нибудь видел видел ХСД для хмл-репортов?


Быстрый поиск по инету результатов не дал...

#7