1

Internet Explorer で単純な XML ドキュメントとして開くのではなく、プログラムで作成し、SharePoint のフォーム ライブラリに追加して InfoPath テンプレートで開く XML ドキュメントを取得する際に問題があります。

基本的に、データベースをチェックして特定の条件が真かどうかを確認する Web サービスがあります。存在する場合、Web サービスは、前述の InfoPath テンプレートによって作成されたファイルと同じ XML スキーマを持つ XML ドキュメントをプログラムで作成します。通常のプロセスでは、実際のユーザーがこの InfoPath テンプレートを開いてデータを入力し、[送信] ボタンをクリックします。これにより、バックグラウンドで XML ドキュメントが作成され、フォーム ライブラリに保存されます。ユーザーが後でその XML ドキュメントを表示するためにフォーム ライブラリにアクセスすると、ドキュメントは (単に Internet Explorer で XML ドキュメントとして開くのではなく) InfoPath テンプレートで自動的に開きます。

Web サービスから生成された XML ドキュメントが、InfoPath から生成された XML ドキュメントとは異なる動作をする理由を突き止めようとしています。Web サービス内で XML ドキュメントを作成するために使用しているコードのスニペットを次に示します。

        //specify path to the SharePoint site and the form library
        var clientContext = new ClientContext("http://urlToSiteContainingTheFormLibrary");
        var site = clientContext.Web;
        clientContext.Load(site);
        var folder = site.GetFolderByServerRelativeUrl("FormLibraryNameHere");
        clientContext.Load(folder);            
        clientContext.ExecuteQuery();

        //create new file to add to the form library
        var fci = new FileCreationInformation();
        var encoding = new System.Text.UTF8Encoding();

        //load the InfoPath document's XML schema from resources file
        var baseXml = XElement.Load(new StringReader(Properties.Resources.BaseXml));
        //fill out the appropriate elements and attributes of the XML here
        //......
        //

        //set remaining properties of the new FileCreationInformation object
        byte[] array = encoding.GetBytes(baseXml.ToString());

        fci.Content = array;
        fci.Overwrite = true;
        fci.Url = "DocumentName"            

        //add the new file to the form library
        var newFile = folder.Files.Add(fci);
        clientContext.Load(newFile);
        var item = newFile.ListItemAllFields;
        clientContext.Load(item);

        //set metadata for the xml file here
        item["HTML_x0020_File_x0020_Type"] = "InfoPath.Document.3";
        item["TemplateUrl"] =
            "http://templateUrlHere/template.xsn?openin=preferclient&noredirect=true&xsnlocation=/templateLocation/template.xsn";
        //set remaining item properties......

        //update changes to the item
        item.Update();

        //commit the changes
        clientContext.ExecuteQuery();

この時点で、XML ドキュメントはフォーム ライブラリに正常に送信されますが、それを開こうとすると、指定したテンプレートを使用するのではなく、Internet Explorer 内でプレーンな XML として開きます。アイテムの HTML_x0020_File_x0020_Type および TemplateUrl プロパティは、SharePoint が InfoPath テンプレートを使用してこのファイルを開く必要があることを知るのに十分な情報を指定すると思いますが、特に設定する必要がある他のプロパティがある可能性があります。同様の問題を経験した人はいますか?最初は、自分のテンプレートに使用している URL が間違っていると思っていましたが、InfoPath テンプレートを介して作成された既存の XML ドキュメントから直接コピーしたので、それが問題だとは思いません (実際の URL は省略しました)。 URL とファイル名は上記のサンプル コードに含まれているため、これらの URL が正しくないという事実は無視してください)。

事前に回答いただきありがとうございます。提供されたヘルプに感謝します。

4

1 に答える 1

0

この質問が出されてからしばらく経ちましたが、解決策、または少なくとも問題を見つけたと思います。

最近、同じ問題を解決しました。

xml と表示されていたファイルの 1 つをダウンロードし、実際には InfoPath であったファイルをメモ帳で開くと、少なくとも実際の文字と同じ数の null ガベージ文字が存在することがわかりました。

XmlTextWriterに書き込むためにを使用していたことがわかりましたMemoryStream。でXmlTextWriter使用してEncoding.UTF8います。Encoding.Default に変更すると、ファイルは正しく保存され、InfoPath として表示されました。

同様の問題を抱えている人は、xml ファイルの値を確認し、null がある場合は削除して再アップロードしてみてください。次に、ドキュメントを作成するコードを確認し、UTF8 として記述されている場合は、UTF16 などの別のエンコーディングを試してください。

于 2012-10-27T03:53:30.883 に答える