簡體   English   中英

如何將 Linq2Xml 作為 web 服務?

[英]How to Linq2Xml a webservice?

我用 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();
}

這種方法效果很好, output 是一個像這樣的字符串:

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

現在我想查看這個字符串,所以我使用 XEle.net 並解析該字符串。 (下面的代碼):

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 與命名空間一起使用?

使用 XDocument class

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 中的字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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