[英]Fetching and modifying the child elements in an xml Document
這是一個棘手的情況。 我有一個返回XML文檔的Web服務。 此XML文檔具有一個名為<Entities .... >
的根元素.Entities元素具有名為<Article..>
子元素。 我需要修改Article的一個子元素,並將每個article元素“PUT”修改回webservice。 我無法使用實體發布整個文檔的原因是因為Web服務無法將實體識別為對象,因此無法對其執行更新操作。
以下是收到的文件的結構:
<Entities>
<Article id="1">
<Permissions>
<Sla id="1">
<name> first sla </name>
</Sla>
</Permissions>
</Article>
<Article id="2">
<Permissions>
<Sla id="2">
<name> second sla </name>
</Sla>
</Permissions>
</Article>
</Entities>
下面是我用來做技巧的代碼,但我可以獲取Sla元素。 我需要做的是在每篇文章中獲取Sla元素並對其id屬性運行檢查。 如果檢查成立,我需要刪除該Sla元素及其所有子元素。 這是我到目前為止所做的:
int pageNumber = 1;
bool entities = true;
while (entities)
{
url = "www.myurl.com";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "Get";
HttpWebResponse rep = (HttpWebResponse)req.GetResponse();
doc.Load(rep.GetResponseStream());
rep.Close();
if (doc != null)
{
XmlNodeList nodes = doc.SelectNodes("/Entities/Article");
foreach (XmlNode node in nodes)
{
XmlNode Slanode = null;
try
{
Slanode = doc.SelectSingleNode("Permissions/Sla[@id='" + sla.ToString() + "']");
Slanode.ParentNode.RemoveChild(node);
string finalXML = doc.OuterXml;
HttpWebRequest reqToUpdate = (HttpWebRequest)WebRequest.Create(url);
reqToUpdate.ContentType = "text/xml; encoding=UTF-8";
reqToUpdate.Method = "PUT";
byte[] bytes = new UTF8Encoding().GetBytes(finalXML);
reqToUpdate.ContentLength = bytes.Length;
Stream data = reqToUpdate.GetRequestStream();
data.Write(bytes, 0, bytes.Length);
data.Close();
}
catch (Exception error)
{
MessageBox.Show(error.Message);
}
}
pageNumber++;
}
else
entities = false;
}
}
我無法讓代碼工作,因為當我到達時
Slanode = doc.SelectSingleNode("Permissions/Sla[@id='" + sla.ToString() + "']");
它沒有填充Slanode並且它返回null,當我在調試模式下檢查節點時,列表顯示以下錯誤:
Only one top level element is allowed in an XML document. Error processing resource
任何幫助將不勝感激。
謝謝
路徑錯了
Slanode = doc.SelectSingleNode("Permissions/Sla[@id='" + sla.ToString() + "']");
應該
Slanode = node.SelectSingleNode("Permissions/Sla[@id='" + sla.ToString() + "']");
我認為。
我將使用XElement重新編寫它,希望這對你有用,因為XElement是我理解的。
首先要刪除文章:
XElement root = XElement.Load(stream);
XElement articleToRemove = root.XPathSelectElement("//Article[Permissions/Sla/@id='"+sla.ToString()+"']");
if(null != articleToRemove)
articleToRemove.Remove();
要使循環可讀,請創建Put函數:
private void Put(XElement article)
{
Stream data = null;
try
{
string finalXML = article.ToString(SaveOptions.DisableFormatting);
HttpWebRequest reqToUpdate = (HttpWebRequest)WebRequest.Create(url);
reqToUpdate.ContentType = "text/xml; encoding=UTF-8";
reqToUpdate.Method = "PUT";
byte[] bytes = new UTF8Encoding().GetBytes(finalXML);
reqToUpdate.ContentLength = bytes.Length;
data = reqToUpdate.GetRequestStream();
data.Write(bytes, 0, bytes.Length);
}
catch (Exception error)
{
MessageBox.Show(error.Message);
}
finally
{
if (null != data)
data.Close();
}
}
然后獲取其余文章並上傳它們:
root.Descendants("Article").ToList().ForEach(a => Put(a));
編輯:要將XPath與XElement一起使用,您需要使用以下內容:
using System.Xml.XPath;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.