Ответ 1
Это:
doc.LoadXml(HttpContext.Current.Server.MapPath("officeList.xml"));
должен быть:
doc.Load(HttpContext.Current.Server.MapPath("officeList.xml"));
LoadXml()
предназначен для загрузки строки XML, а не имени файла.
У меня есть следующий XML-документ:
<?xml version="1.0" encoding="UTF-8"?>
<Offices id="0" enabled="false">
<office />
</Offices>
Когда я пытаюсь получить к нему доступ через С#:
XmlDocument doc = new XmlDocument();
doc.LoadXml(HttpContext.Current.Server.MapPath("officeList.xml"));
Я получаю эту ошибку:
Данные на корневом уровне недействительны. Строка 1, позиция 1.
Что не так с этой линией?
Это:
doc.LoadXml(HttpContext.Current.Server.MapPath("officeList.xml"));
должен быть:
doc.Load(HttpContext.Current.Server.MapPath("officeList.xml"));
LoadXml()
предназначен для загрузки строки XML, а не имени файла.
Для записи:
"Данные на корневом уровне недействительны" означает, что вы попытались разобрать что-то, что не является документом XML. Он даже не похож на документ XML. Обычно это означает только то, что вы нашли: вы разбираете что-то вроде строки "C:\inetpub\wwwroot\mysite\officelist.xml".
Я обнаружил, что пример, который я использовал, имел спецификацию документа xml в первой строке. Я использовал таблицу стилей, которую я получил в этой записи в блоге, а первая строка была
<?xmlversion="1.0"encoding="utf-8"?>
который вызывал ошибку. Когда я удалил эту строку, чтобы таблица стилей начиналась с строки
<xsl:stylesheet version="1.0" xmlns:DTS="www.microsoft.com/SqlServer/Dts" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
мое преобразование сработало. Кстати, этот пост в блоге был первым хорошим, простым в использовании примером, который я нашел для попытки получить информацию из XML-определения пакета SSIS, но мне пришлось изменить пути в примере для моих пакетов SSIS 2008, так что вы тоже можете. Я также создал версию для извлечения "потока" из ограничений приоритета. Мой последний выглядит следующим образом:
<xsl:stylesheet version="1.0" xmlns:DTS="www.microsoft.com/SqlServer/Dts" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" />
<xsl:template match="/">
<xsl:text>From,To~</xsl:text>
<xsl:text>
</xsl:text>
<xsl:for-each select="//DTS:PrecedenceConstraints/DTS:PrecedenceConstraint">
<xsl:value-of select="@DTS:From"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="@DTS:To"/>
<xsl:text>~</xsl:text>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
и дал мне CSV с тильдой в качестве разделителя строк. Я заменил это с помощью строки в текстовом редакторе, а затем импортировал в excel, чтобы посмотреть на поток данных в пакете.