C# - 将 XML 节点值设置为来自 StreamReader 结果的 Stings

标签 c# xml winforms streamreader

我正在使用 API 调用从网络服务器返回一些 XML 数据。 XML 数据采用以下格式:

<forismatic>
    <quote>
        <quoteText>The time you think you're missing, misses you too.</quoteText>               
        <quoteAuthor>Ymber Delecto</quoteAuthor>
        <senderName></senderName>
        <senderLink></senderLink>
        <quoteLink>http://forismatic.com/en/55ed9a13c0/</quoteLink>
    </quote>
</forismatic>

我可以成功检索原始 XML 数据,我想添加 <quoteText><quoteAuthor>节点值到字符串,但似乎无法做到这一点。我当前的代码:

    private void btnGetQuote_Click(object sender, EventArgs e)
    {
        WebRequest req = WebRequest.Create("http://api.forismatic.com/api/1.0/");                            
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";

        string reqString = "method=getQuote&key=457653&format=xml&lang=en";
        byte[] reqData = Encoding.UTF8.GetBytes(reqString);
        req.ContentLength = reqData.Length;

        using (Stream reqStream = req.GetRequestStream())
            reqStream.Write(reqData, 0, reqData.Length);

        using (WebResponse res = req.GetResponse())
        using (Stream resSteam = res.GetResponseStream())
        using (StreamReader sr = new StreamReader(resSteam))
        {
            string xmlData = sr.ReadToEnd();
            txtXmlData.Text = xmlData;
            Read(xmlData);
        }
    }

    private void Read(string xmlData)
    {
        XDocument doc = XDocument.Parse(xmlData);
        string quote = doc.Element("quote").Attribute("quoteText").Value;
        string auth = doc.Element("quote").Attribute("quoteAuthor").Value;
        txtQuoteResult.Text = "QUOTE: " + quote + "\r\n" + "AUTHOR: " + auth;                    
    }

在尝试设置字符串值 quote 时,我的程序因发生“System.NullReferenceException”类型的未处理异常而崩溃。 .我查看了一些类似的帖子并进行了各种更改,但似乎无法设置两个字符串值。

最佳答案

您正在尝试使用 doc.Element("quote") - 没有这样的元素,因此返回 null。您需要 doc.Root.Element("quote")。接下来,您将请求 quoteTextquoteAuthor,就好像它们是属性一样 - 它们不是,它们也是元素。

所以基本上你想要:

private void Read(string xmlData)
{
    XDocument doc = XDocument.Parse(xmlData);
    XElement quote = doc.Root.Element("quote");
    string text = quote.Element("quoteText").Value;
    string author = quote.Element("quoteAuthor").Value;
    txtQuoteResult.Text = $"QUOTE: {text}\r\nAUTHOR: {author}";
}

(我个人会让方法返回字符串值并在调用方法中将其设置为txtQuoteResult.Text,但这是另一回事。)

关于C# - 将 XML 节点值设置为来自 StreamReader 结果的 Stings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42023331/

相关文章:

.net - 提取window的所有子窗口

c# - 如何显示超过 63 个字符的系统托盘工具提示?

c# - Nhibernate ArgumentNullException 未处理 值不能为 null 参数名称 : stream

c# - 按发件人电子邮件地址查找电子邮件 - 过滤器语法

android - 为 <declare-stylable> 定义一个必需的属性

java - Spring MVC 基于 xml 的配置到注释

c# - 使用C#在xml文档中获取特定值

c# - 通过异步方法和任务使用下载的数据填充 ASP.NET 控件

c# - 正则表达式获取花括号之间的字符串

c# - 在 ListView 的网格中显示 128x128 像素或更大的缩略图图标