簡體   English   中英

無法在c#中解析XML字符串

[英]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特殊的意義 ,你不能直接使用它們。 你應該用&amp; 如果您確定xml中沒有實體引用 ,那么簡單的String.Replace將完成這項工作:

xml_string = xml_string.Replace("&", "&amp;");

回到解析。 您可以使用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.

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