这是一个棘手的情况。我有一个返回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
任何帮助将不胜感激。
由于
答案 0 :(得分:1)
路径错误
Slanode = doc.SelectSingleNode("Permissions/Sla[@id='" + sla.ToString() + "']");
应该是
Slanode = node.SelectSingleNode("Permissions/Sla[@id='" + sla.ToString() + "']");
我想。
答案 1 :(得分:1)
我打算用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));
编辑:要在XElement中使用XPath,您需要使用以下内容:
using System.Xml.XPath;