Чем читать Кристал-Репорт.хмл?
Чем читать Кристал-Репорт.хмл?
Клиент не смог конвертировать свою внутреннюю документацию с нормальный ЦСВ-файл
и желает присылать данные в виде кристал-репортовского хмла.
Наворочено там... много.
Могу сделать тремя вариантами:
- слепить хслт и трансформировать документ во что-то цсв-лике
- читать как ХМЛ-документ и выдергивать нужное хпатхьом
- написать реадер с имеющимися в документе обьектами.
Плюсы и минусы каждого варианта - понятны.
Вопросик: А нет ли какой уже написанной либы для чтения этих репортоv?
Почитал кучку информации на разных форумах.
Наиболее подходящим вариантом выглядит следующий:
- инсталировать последний рун-тиме для САП КристалРепорт.
- после инсталляции использовать CrystalDecisions.CrystalReports.Engine.dll
Поиски на просторах инета позволили отыскать свеженький рун-тиме.
Инсталляция тоже прошла без проблем.
Результат: файлов CrystalDecisions.CrystalReports.* в системе нет.
Разархивировал рун-тиме - файлы в наличии имеются.
Вопрос - что Я делаю не так кликая по имеющимся кнопкам?
Нашлись файлы где-то в ГАКе.
Понятнее как читать присланный документ - не стало.
Попутно выяснилось что писать Хмл Я таки тоже не умею.
Как правильно прописать намеспасы в ДокументЕлемент?
Делал так
pXmlWriter.WriteStartElement(ElementName, XmlNs);
pXmlWriter.WriteAttributeString(XmlNs, "bam:value");
отваливается с невозможностью заменить пустую строку на значение XmlNs...
На завтра...
/*
//
// следующий код записывал намеспайсы, которые записываются
// по умолчанию стандартным 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();
*/
Пока не победил следующее:
требуется писать хмл-документ со всеми намеспасами.
<?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.
Поторопился...
Есть решение для такого варианта.
char[] splitters = new Char[] { ':' };void IXmlSerializable.WriteXml(XmlWriter pXmlWriter){string xmlns = attributes[XmlNs];pXmlWriter.WriteStartElement(ElementName, xmlns); // element name and value for xmlnsforeach(KeyValuePair<string,string> kvp in attributes){string[] splitted = kvp.Key.Split(splitters);if (splitted.Length == 1)pXmlWriter.WriteAttributeString(XmlNs, kvp.Value);elsepXmlWriter.WriteAttributeString(splitted[0], splitted[1], null, kvp.Value);}pXmlWriter.WriteFullEndElement();}
Не полное, но мне хватит...
А кому-нибудь встречалась FormattedReport.xsd?
Написать - написал. Работает.
Не нравится то, что нет гарантии на то, что будет работать с любыми подобными документами.
Отсюда вопрос - кто-нибудь видел видел ХСД для хмл-репортов?
Быстрый поиск по инету результатов не дал...