1
所以我有一個已經存在的文件,並且我讀取了這個文件並向它添加了一些節點。由於所需處理的性質,我將代碼放在一個循環中,因此對於給定數據表中的每一行,我打開現有文件,寫入新節點並關閉文件。C#XML代碼生成的XML輸出中的格式錯誤
第一次迭代完美地插入節點組。此後的每次迭代都會產生問題,並以某種方式添加到第一個分組中,而不是創建自己的分組。
這是每個分組應該是什麼樣子,這是怎麼產生的第一個:
<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條目。
這是我正在使用的代碼。請記住,這些代碼在同一個文件上被多次執行,每個條目集合執行一次。還有一個由代碼創建的附加節點,這個節點被稱爲資源,但該部分工作正常,所以我沒有將它包含在上面的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
這正是我一直在尋找的。我不知道爲什麼我沒有這樣做! – user1366062