1

したがって、既に存在するファイルがあり、このファイルを読み取り、いくつかのノードを追加します。必要な処理の性質上、コードがループになっているため、特定のデータ テーブルの各行に対して、既存のファイルを開き、新しいノードを書き込んで、ファイルを閉じます。

最初の反復では、ノード グループが完全に挿入されます。その後のすべての反復には問題があり、独自のグループ化を作成する代わりに、何らかの方法で最初のグループ化に追加されます。

これは、各グループ化がどのように見えるかであり、これが最初のグループを生成する方法です:

  <item identifier="ITEM-F2D7FEDF240B4DCCBF346DBE2C47AC89" identifierref="RES-770DCE40C5BA4E97B1E3B3DB49BBBD4F" isvisible="true" parameters="">
    <title>Title1</title>
    <adlcp:datafromlms xmlns:adlcp="http://www.imsproject.org/xsd/imscp_rootv1p1p2">
    </adlcp:datafromlms>
  </item>

全体が処理されると、次のようになります。

  <item identifier="ITEM-F2D7FEDF240B4DCCBF346DBE2C47AC89" identifierref="RES-770DCE40C5BA4E97B1E3B3DB49BBBD4F" isvisible="true" parameters="">
    <title>Title1</title>
    <adlcp:datafromlms xmlns:adlcp="http://www.imsproject.org/xsd/imscp_rootv1p1p2">
    </adlcp:datafromlms>
    <title>Title2</title>
    <adlcp:datafromlms xmlns:adlcp="http://www.imsproject.org/xsd/imscp_rootv1p1p2">
    </adlcp:datafromlms>
    <title>Title3</title>
    <adlcp:datafromlms xmlns:adlcp="http://www.imsproject.org/xsd/imscp_rootv1p1p2">
    </adlcp:datafromlms>
    <title>Title4</title>
    <adlcp:datafromlms xmlns:adlcp="http://www.imsproject.org/xsd/imscp_rootv1p1p2">
    </adlcp:datafromlms>
    <title>Title5</title>
    <adlcp:datafromlms xmlns:adlcp="http://www.imsproject.org/xsd/imscp_rootv1p1p2">
    </adlcp:datafromlms>
  </item>
  <item identifier="ITEM-4D80AFFE59D04E2188F39908B9325961" identifierref="RES-A9CFDC9208714DAF9EA351D4656A7EBC" isvisible="true" parameters="" />
  <item identifier="ITEM-F4EDB38AD0D74CC38722E6D1A8D67E24" identifierref="RES-E2F92D4C5165482386421944053EE933" isvisible="true" parameters="" />
  <item identifier="ITEM-BF1C7474919B4B22BC300F98034ABDD1" identifierref="RES-8A0ED1C94CA44A71A07A8A4A5DA2A528" isvisible="true" parameters="" />
  <item identifier="ITEM-156731B2ABB14AB29135CBF5D8CBCFF3" identifierref="RES-D452D539C49A4D65BC3A8AC6B16DE718" isvisible="true" parameters="" />

したがって、基本的には、新しいデータの大部分を既存のノード (不要な場所) に追加し、組織グループの下部 (本来あるべき場所) に新しい項目ノードを作成することになります。各新しい項目ノードの下にタイトルと adlcp エントリを追加する必要があります。

これが私が使用しているコードです。このコードは、エントリのセットごとに 1 回、同じファイルに対して複数回実行されることに注意してください。リソースと呼ばれる別の場所に入るコードによって作成された追加のノードがありますが、その部分は正常に機能するため、上記の XML の抜粋には含めませんでした。

            string strItem = Guid.NewGuid().ToString("N").ToUpper(); // GUID for random unique value.
            string strRes = Guid.NewGuid().ToString("N").ToUpper(); // GUID for random unique value.

            XmlDocument docXMLFile = new XmlDocument();
            docXMLFile.Load(resultPath + "imsmanifest.xml"); // Load file

            #region Item Element Creation
            XmlNode xItem = docXMLFile.CreateNode(XmlNodeType.Element, "item", docXMLFile.DocumentElement.NamespaceURI);
            XmlAttribute xIdentifier = docXMLFile.CreateAttribute("identifier");
            XmlAttribute xIdentifierRef = docXMLFile.CreateAttribute("identifierref");
            XmlAttribute xIsVisible = docXMLFile.CreateAttribute("isvisible");
            XmlAttribute xParameters = docXMLFile.CreateAttribute("parameters");
            xIdentifier.Value = "ITEM-" + strItem;
            xIdentifierRef.Value = "RES-" + strRes;
            xIsVisible.Value = "true";
            xParameters.Value = "";

            xItem.Attributes.Append(xIdentifier);
            xItem.Attributes.Append(xIdentifierRef);
            xItem.Attributes.Append(xIsVisible);
            xItem.Attributes.Append(xParameters);

            // NOTE - the docXMLFile.DocumentElement.NamespaceURI GETS RID OF XMLNS="" WHICH IS BULLSHIT.
            XmlNode xTitle = docXMLFile.CreateNode(XmlNodeType.Element, "title", docXMLFile.DocumentElement.NamespaceURI);

            if ((dataRow["product_name"].ToString() + " - " + dataRow["topic_name"].ToString()).Count() > 255)
                xTitle.InnerText = (dataRow["product_name"].ToString() + " - " + dataRow["topic_name"].ToString()).Substring(0, 255);
            else
                xTitle.InnerText = dataRow["product_name"].ToString() + " - " + dataRow["topic_name"].ToString();

            XmlNode xADLCPDataFromLMS = docXMLFile.CreateNode(XmlNodeType.Element, "adlcp:datafromlms", docXMLFile.DocumentElement.NamespaceURI);
            xADLCPDataFromLMS.InnerText = dataRow["datafromlms"].ToString();

            // This is where the new stuff gets inserted.
            docXMLFile.GetElementsByTagName("organization")[0].InsertAfter(xItem, docXMLFile.GetElementsByTagName("organization")[0].LastChild);
            docXMLFile.GetElementsByTagName("item")[0].InsertAfter(xTitle, docXMLFile.GetElementsByTagName("item")[0].LastChild);
            docXMLFile.GetElementsByTagName("item")[0].InsertAfter(xADLCPDataFromLMS, docXMLFile.GetElementsByTagName("item")[0].LastChild);
            #endregion

            #region Resource Element Creation
            XmlNode xResource = docXMLFile.CreateNode(XmlNodeType.Element, "resource", docXMLFile.DocumentElement.NamespaceURI);
            XmlAttribute xRefIdentifier = docXMLFile.CreateAttribute("identifier");
            XmlAttribute xRefADLCP = docXMLFile.CreateAttribute("adlcp:scormtype");
            XmlAttribute xRefHREF = docXMLFile.CreateAttribute("href");
            XmlAttribute xRefType = docXMLFile.CreateAttribute("type");
            xRefIdentifier.Value = "RES-" + strRes;
            xRefADLCP.Value = "sco";
            xRefHREF.Value = dataRow["launch_url"].ToString().ToLower();
            xRefType.Value = "webcontent";

            xResource.Attributes.Append(xRefIdentifier);
            xResource.Attributes.Append(xRefADLCP);
            xResource.Attributes.Append(xRefHREF);
            xResource.Attributes.Append(xRefType);

            docXMLFile.GetElementsByTagName("resources")[0].InsertAfter(xResource, docXMLFile.GetElementsByTagName("resources")[0].LastChild);
            #endregion

            docXMLFile.Save(resultPath + "imsmanifest.xml"); //save
4

1 に答える 1

3

さて、これが問題です:

docXMLFile.GetElementsByTagName("item")[0]
          .InsertAfter(xTitle,
                       docXMLFile.GetElementsByTagName("item")[0].LastChild);
docXMLFile.GetElementsByTagName("item")[0]
          .InsertAfter(xADLCPDataFromLMS, 
                       docXMLFile.GetElementsByTagName("item")[0].LastChild);

最初の要素を明示的に使用しています。item私はあなたが本当に欲しいと思う:

xItem.AppendChild(xTitle);
xItem.AppendChild(xADLCPDataFromLMS);

結局のところ、新しく作成された要素に要素を追加するにはどうすればよいでしょitemうか?

于 2012-05-25T12:58:48.603 に答える