簡體   English   中英

獲取和修改xml文檔中的子元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM