0

HttpWebRequest.Createメソッドを使用してWebServiceを呼び出し、StreamReaderを使用して読み取ります(以下のメソッドがこのジョブを実行します)。

private string ReadWebMethod(string address)
{
    var myRequest = (HttpWebRequest)HttpWebRequest.Create(address);
    myRequest.Method = "POST";
    using (var responseReader = new StreamReader(myRequest.GetResponse().GetResponseStream()))
        return responseReader.ReadToEnd();
}

このメソッドはうまく機能し、次のような文字列を出力します。

<ArrayOfAppObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
<AppObject>
<Name>MyApp</Name>
<Image>StoreApp.png</Image>
<Version>SM2.1.0</Version>
</AppObject>
</ArrayOfAppObject>

ここで、この文字列を確認したいので、XElemnetを使用して文字列を解析します。(コードの下):

XElement x = XElement.Parse(ReadWebMethod(address));

これで、foreach、x.Elements( "AppObject")を実行すると、アイテムが返されず、foreachがスキップされます。私のforeachは次のようなものです:

foreach (var item in x.Elements("AppObject"))
{
    listApplication.Add(new AppObject { Image = item.Element("Image").Value, Name = item.Element("Name").Value, Version = item.Element("Version").Value });
}

ローカル文字列を作成し、「ArrayOfAppObject」(xmlns:xsi = "htt ...)(xmlnamespaceという名前の場合もあります)の後に属性を削除して再度テストします。これも機能し、foreachはスキップされません。

だから、どうすれば名前空間でxmlを使用できますか?

4

1 に答える 1

2

XDocumentクラスを使用する

using System.Xml.Linq;

//...
var xml = ReadWebMethod(address);
var xdocument = System.Xml.Linq.XDocument.Parse(xml);

更新

XMLデータが名前空間を定義するように。xmlns="http://tempuri.org/"

有効な名前空間で完全なXNameを宣言する必要があります。各要素の値にアクセスするには

XName theElementName = XName.Get("AppObject", "http://tempuri.org/");
//or alternate way..
XName theElementName = XName.Get("{http://tempuri.org/}AppObject");

こちらのサンプル試験方法

[TestMethod]
public void ParseXmlElement()
{
    XDocument xdoc = XDocument.Parse(this.mockXml);

    XName appTag = XName.Get("{http://tempuri.org/}AppObject");
    XName nameTag = XName.Get("{http://tempuri.org/}Name");
    XName imageTag = XName.Get("{http://tempuri.org/}Image");

    XElement objElement = xdoc.Root.Element(appTag);
    Assert.IsNotNull(objElement, "<AppObject> not found");
    Assert.AreEqual("{http://tempuri.org/}AppObject", objElement.Name);

    XElement nameElement = objElement.Element(nameTag);
    Assert.IsNotNull(nameElement, "<Name> not found");
    Assert.AreEqual("MyApp", nameElement.Value);

    XElement imageElement = objElement.Element(imageTag);
    Assert.IsNotNull(imageElement, "<Image> not found");
    Assert.AreEqual("StoreApp.png", imageElement.Value);
}

このようにXml.Linqを使用します。

[TestMethod]
public void ParseXmlLinq()
{
    XDocument xdoc = XDocument.Parse(this.mockXml);

    XElement app = xdoc.Root.Elements()
        .FirstOrDefault(e => e.Name == XName.Get("AppObject", "http://tempuri.org/"));

    Assert.IsNotNull(app, "<AppObject> not found");

    XElement img = app.Elements()
        .FirstOrDefault(x => x.Name == XName.Get("Image", "http://tempuri.org/"));

    Assert.IsNotNull(img, "<Image> not found");
    Assert.AreEqual("StoreApp.png", img.Value);
}

XMLから文字列をモックアップして解析するだけであることに注意してください。

于 2012-04-07T05:59:12.807 に答える