0

ここでちょっと厄介な状況です。XML ドキュメントを返す Web サービスがあります。この XML ドキュメントには、 というルート要素があります。<Entities .... >エンティティ要素には、 という子要素があり<Article..>ます。Article の子要素の 1 つを変更し、各 article 要素を Web サービスに「PUT」する必要があります。エンティティを含むドキュメント全体を投稿できないのは、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() + "']");

デバッグ モードでノードを確認すると、リストに次のエラーが表示されていました。

Only one top level element is allowed in an XML document. Error processing resource

どんな助けでも大歓迎です。

ありがとう

4

2 に答える 2

1

パスが間違っている

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

する必要があります

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

おもう。

于 2012-07-29T02:49:06.983 に答える
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;
于 2012-07-29T04:43:45.000 に答える