2012-07-29 79 views
0

這是一個棘手的情況。我有一個返回XML文檔的web服務。此XML文檔具有一個稱爲<Entities .... >的根元素。實體元素具有名爲<Article..>的子元素。我需要修改文章的一個子元素,並將每個文章元素「放」回web服務。我無法使用實體發佈整個文檔的原因是因爲web服務無法將實體識別爲對象,我無法對其執行更新操作。在xml中獲取和修改子元素文檔

下面是文檔的結構獲得:

<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

任何幫助將是不勝感激。

感謝

回答

1

道路是錯誤的

Slanode = doc.SelectSingleNode("Permissions/Sla[@id='" + sla.ToString() + "']"); 

應該

Slanode = node.SelectSingleNode("Permissions/Sla[@id='" + sla.ToString() + "']"); 

我想。

1

我打算用XElement重新編寫,希望對你有用,因爲XElement就是我所理解的。

首先得到該文章刪除:

XElement root = XElement.Load(stream); 
XElement articleToRemove = root.XPathSelectElement("//Article[Permissions/Sla/@id='"+sla.ToString()+"']"); 
if(null != articleToRemove) 
    articleToRemove.Remove(); 

爲了使循環讀取,創建一個看跌功能:

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)); 

編輯:要使用帶有XElement的XPath,您需要使用以下內容:

using System.Xml.XPath;