[英]Unable to Parse XML string in c#
我嘗試了很多但是無法從xml字符串獲取值,xml字符串是
<UtilityRateSummaries SchemaVersion="1.0">
<Utility UtilityId="81" UtilityName="Pacific Gas and Electric Company (PG&E)">
<Rate Id="238" Name="Residential Service (Rate E1 Area Y Code B)" Sector="Residential" Metering="OptionalNetMetering" IsDefault="true" IsTimeOfUse="false"/>
</Utility>
</UtilityRateSummaries>
我想要這個xml文件中的所有值,
我正在使用以下課程
[DataContract]
public class getPowerBillRateData
{
[DataMember]
public string UtilityId { get; set; }
[DataMember]
public string UtilityName { get; set; }
[DataMember]
public string RateId { get; set; }
[DataMember]
public string RateName { get; set; }
[DataMember]
public string RateSector { get; set; }
[DataMember]
public string RateMetering { get; set; }
[DataMember]
public string IsDefault { get; set; }
[DataMember]
public string IsTimeofUse { get; set; }
}
我試過跟隨代碼,但沒有一個工作。
PowerBillRate.UtilityName = xmlDoc.DocumentElement["Rate"].ChildNodes[0].InnerText;
獲取xml的代碼
XmlDocument xmlDoc = new XmlDocument();
using (var client = new CookieAwareWebClient())
{
Uri uri = new Uri("https://www.mywebserviceurl.com/Services.svc/Rate/" + 238 + "");
client.Credentials = new NetworkCredential("myUsername", "myPassword");
strFetchResData = client.DownloadString(uri);
xmlDoc.LoadXml(strFetchResData);
}
某些字符喜歡&
有一個在XML特殊的意義 ,你不能直接使用它們。 你應該用&
。 如果您確定xml中沒有實體引用 ,那么簡單的String.Replace
將完成這項工作:
xml_string = xml_string.Replace("&", "&");
回到解析。 您可以使用LINQ to XML:
var xdoc = XDocument.Parse(xml_string);
var utility = xdoc.Root.Element("Utility");
var data = new getPowerBillRateData();
data.UtilityId = (string)utility.Attribute("UtilityId");
data.UtilityName = (string)utility.Attribute("UtilityName");
var rate = utility.Element("Rate");
data.RateId = (string)rate.Attribute("Id");
data.RateName = (string)rate.Attribute("Name");
data.RateSector = (string)rate.Attribute("Sector");
//etc
另外,我建議您為數據使用更好的命名和更合適的數據類型(整數,布爾值):
[DataContract]
public class Utility
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public Rate Rate { get; set; }
}
[DataContract]
public class Rate
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Sector { get; set; }
[DataMember]
public string Metering { get; set; }
[DataMember]
public bool IsDefault { get; set; }
[DataMember]
public bool IsTimeofUse { get; set; }
}
XmlSerializer是可行的方法,代碼比LINQ更清晰,更快。 我在這里使用LINQ來打印一個屬性的值,IEnumerable可以幫助你獲得其余的元素及其屬性。
XDocument xDoc = XDocument.Parse(xml);
XElement root = xDoc.Root;
Console.WriteLine(root.Attribute((XName)"SchemaVersion").Value);
IEnumerable<XElement> elements = root.Descendants();
這取決於你想要對數據做什么,但使用之前提到的'Serializable',可以很容易地處理/處理數據
[Serializable]
[XmlRoot("UtilityRateSummaries")]
public class UtilityRateSummaries
{
[XmlElement("Utility")]
public Utility Utility { get; set; }
[XmlElement("Rate")]
public Rate Rate { get; set; }
}
public class Utility
{
[XmlAttribute]
public string UtilityId { get; set; }
[XmlAttribute]
public string UtilityName { get; set; }
}
public class Rate
{
[XmlAttribute]
public string Id { get; set; }
[XmlAttribute]
public string Name { get; set; }
[XmlAttribute]
public string Sector { get; set; }
[XmlAttribute]
public string Metering { get; set; }
[XmlAttribute]
public string IsDefault { get; set; }
[XmlAttribute]
public string IsTimeOfUse { get; set; }
}
取消和序列化的方法:
public static void Serialize(string filename, UtilityRateSummaries objToXMl)
{
var xs
= new XmlSerializer(objToXMl.GetType());
var writer = File.CreateText(filename);
xs.Serialize(writer, objToXMl);
writer.Flush();
writer.Close();
}
public static UtilityRateSummaries Deserialize(string filename)
{
var xs
= new XmlSerializer(
typeof(UtilityRateSummaries));
var reader = File.OpenText(filename);
var utilityRateSummaries = (UtilityRateSummaries)xs.Deserialize(reader);
reader.Close();
return utilityRateSummaries;
}
static void Main(string[] args)
{
var obj1 = new UtilityRateSummaries();
obj1.Utility = new Utility();
obj1.Utility.UtilityId = 81;
obj1.Utility.UtilityName = "Pacific Gas and Electric Company (PG&E)";
obj1.Rate = new Rate();
obj1.Rate.Id = 238;
obj1.Rate.Name = "Residential Service (Rate E1 Area Y Code B)";
obj1.Rate.IsDefault = true;
obj1.Rate.IsTimeOfUse = false;
obj1.Rate.Metering = "OptionalNetMetering";
obj1.Rate.Name = "1";
obj1.Rate.Sector = "Residential";
Serialize("bla.xml",obj1);
var obj = Deserialize("bla.xml");
Console.Out.WriteLine(obj.Rate.Id);
}
PS:你的XML無效,也可能是個問題!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.