次のXMLドキュメントがあります。
<?xml version="1.0" encoding="UTF-8"?>
<Offices id="0" enabled="false">
<office />
</Offices>
C#からアクセスしようとすると:
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ドキュメントではない何かを解析しようとしたことを意味します。 startでさえ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">
私の変換は機能しました。ちなみに、そのブログ投稿は、SSISパッケージのXML定義から情報を取得しようとするために見つけた最初の良い、わかりやすい例でしたが、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にインポートして、パッケージのデータフローを確認しました。