2

複数の添付ファイルを含む可能性のあるInfoPathフォームがあります。繰り返し要素のグループを使用することにより、ユーザーは[アイテムの追加]オプションをクリックして、さらに添付ファイルをアップロードできるようになります。Sharepointでは、ワークフローを使用して添付ファイルを抽出し、別のリストに配置しています。これまでのところ、最初のものを抽出することしかできず、ワークフローは正常に終了します。

フォームを反復処理するためにループなどを配置できますか?

以下のコードを添付します。

    public sealed partial class FileCopyFeature : SharePointSequentialWorkflowActivity
    {
        public FileCopyFeature()
        {
            InitializeComponent();
        }

        public Guid workflowId = default(System.Guid);
        public Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties workflowProperties = new Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties();

        private void CopyFile(object sender, EventArgs e)
        {

            // Retrieve the file associated with the item
            // on which the workflow has been instantiated
            SPFile file = workflowProperties.Item.File;

            if (file == null)
                return;

            // Get the binary data of the file
            byte[] xmlFormData = null;
            xmlFormData = file.OpenBinary();

            // Load the data into an XPathDocument object
            XPathDocument ipForm = null;

            if (xmlFormData != null)
            {
                using (MemoryStream ms = new MemoryStream(xmlFormData))
                {
                    ipForm = new XPathDocument(ms);
                    ms.Close();
                }
            }

            if (ipForm == null)
                return;

            // Create an XPathNavigator object to navigate the XML
            XPathNavigator ipFormNav = ipForm.CreateNavigator();

            ipFormNav.MoveToFollowing(XPathNodeType.Element);
            XmlNamespaceManager nsManager =
            new XmlNamespaceManager(new NameTable());

            foreach (KeyValuePair<string, string> ns
            in ipFormNav.GetNamespacesInScope(XmlNamespaceScope.All))
            {
                if (ns.Key == String.Empty)
                {
                    nsManager.AddNamespace("def", ns.Value);
                }
                else
                {
                    nsManager.AddNamespace(ns.Key, ns.Value);
                }
            }

           do
            {


                XPathNavigator nodeNav = ipFormNav.SelectSingleNode("//my:field2", nsManager);


                // Retrieve the value of the attachment in the InfoPath form
                //XPathNavigator nodeNav = ipFormNav.SelectSingleNode(
                //"//my:field2", nsManager);

                string ipFieldValue = string.Empty;
                if (nodeNav != null)
                {
                    ipFieldValue = nodeNav.Value;

                    // Decode the InfoPath file attachment
                    InfoPathAttachmentDecoder dec =
                    new InfoPathAttachmentDecoder(ipFieldValue);
                    string fileName = dec.Filename;
                    byte[] data = dec.DecodedAttachment;

                    // Add the file to a document library
                    using (SPWeb web = workflowProperties.Web)
                    {
                        SPFolder docLib = web.Folders["Doc"];
                        docLib.Files.Add(fileName, data);
                        docLib.Update();
                        // workflowProperties.Item.CopyTo(data + "/Doc/" + fileName);
                    }

                }

            }
            while (ipFormNav.MoveToNext());

        }
   }
    /// <summary>
    /// Decodes a file attachment and saves it to a specified path.
    /// </summary>
    public class InfoPathAttachmentDecoder
    {
        private const int SP1Header_Size = 20;
        private const int FIXED_HEADER = 16;

        private int fileSize;
        private int attachmentNameLength;
        private string attachmentName;
        private byte[] decodedAttachment;

        /// <summary>
        /// Accepts the Base64 encoded string
        /// that is the attachment.
        /// </summary>
        public InfoPathAttachmentDecoder(string theBase64EncodedString)
        {
            byte[] theData = Convert.FromBase64String(theBase64EncodedString);
            using (MemoryStream ms = new MemoryStream(theData))
            {
                BinaryReader theReader = new BinaryReader(ms);
                DecodeAttachment(theReader);
            }
        }

        private void DecodeAttachment(BinaryReader theReader)
        {
            //Position the reader to get the file size.
            byte[] headerData = new byte[FIXED_HEADER];
            headerData = theReader.ReadBytes(headerData.Length);

            fileSize = (int)theReader.ReadUInt32();
            attachmentNameLength = (int)theReader.ReadUInt32() * 2;

            byte[] fileNameBytes = theReader.ReadBytes(attachmentNameLength);
            //InfoPath uses UTF8 encoding.
            Encoding enc = Encoding.Unicode;
            attachmentName = enc.GetString(fileNameBytes, 0, attachmentNameLength - 2);
            decodedAttachment = theReader.ReadBytes(fileSize);
        }

        public void SaveAttachment(string saveLocation)
        {
            string fullFileName = saveLocation;
            if (!fullFileName.EndsWith(Path.DirectorySeparatorChar.ToString()))
            {
                fullFileName += Path.DirectorySeparatorChar;
            }

            fullFileName += attachmentName;

            if (File.Exists(fullFileName))
                File.Delete(fullFileName);

            FileStream fs = new FileStream(fullFileName, FileMode.CreateNew);
            BinaryWriter bw = new BinaryWriter(fs);
            bw.Write(decodedAttachment);

            bw.Close();
            fs.Close();
        }

        public string Filename
        {
            get { return attachmentName; }
        }

        public byte[] DecodedAttachment
        {
            get { return decodedAttachment; }
        }
4

1 に答える 1

0

問題は の使用に関係しているようですMoveToNextドキュメントによると、この関数は次の兄弟に移動し、子要素には移動しません。あなたのコードは、最初に見つかった要素 (おそらくmy:myFields) に移動するように見え、名前が付けられた最初の子を探します ( をmy:field2使用しているため、最初の要素のみをプルしSelectSingleNode、 の次の兄弟my:myFields( の次の兄弟ではありません) に移動しmy:field2ます)。これを修正する方法は、現在のdo-whileループを次のような呼び出しに置き換えてからSelectNodes、 を反復処理することnodeListです。

XmlNodeList nodelist = ipFormNav.SelectNodes("//my:field2", nsManager);
于 2013-08-08T11:03:25.687 に答える