c# - 如何使用 Linq 读取 XML

标签 c# xml vb.net linq dataset

我有一个程序可以查询数据库并报告结果。这是我的查询:

Select Service, Total
From Services
Where dtcreated between @startdate and @enddate

名为dataset的数据集将此报告给reportviewer1

然后我有一个 xml 文件,这里是 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Database.-->
<config>
    <goals>
           <service1>4</service1>
           <service2>3</service2>
        </goals>
</config>

xml(位置 C:\config.xml)向 Reportviewer2 报告

我想要做的是通过电子邮件发送查询结果以及 xml 文件中的服务目标值。我可以使用 LINQ 将要从数据集中通过电子邮件发送的表格放在一起,我的代码如下:

Dim xelement As XElement = xelement.Load("C:\Config.xml")
Dim employees As IEnumerable(Of XElement) = xelement.Elements()

    Dim test = _
    <html><body><table><tr><th>Service</th><th>Total Sold</th><th>Goals</th></tr>
        <%= From service In Me.Dataset.datatable.AsEnumerable _
            Select <tr><td><%= service.Service_Category.ToString %></td>
                       <td><%= service.Total_Sold.ToString %></td>
                       <%= From XMLFile In xelement.Descendants("goals").AsEnumerable _
                           Select <td><%= XMLFile.Descendants("goals").Value %></td> %></tr> %>
        </table></body></html>

现在我想做的是将 XML 文件的值包含在同一个表中,以便在上面数据构建的第三列中报告。正如您所看到的,第三列我希望成为“目标”,它应该显示 4,然后根据我的配置文件显示 3。如何将 xml 文件的值包含在上面的 Linq 和 HTML 构建中?这是我当前的输出:

Service Total Sold  Goals
Service1       51   
Service2       12   

如您所见,我在配置文件中缺少“4”和“3”。

这是我希望的输出:

Service Total Sold  Goals
Service1    51            4
Service2    12            3

最佳答案

您可以使用 Linq to XML 来完成此操作(希望对象已经存在或者您可以创建一个对象),并使用 linqpad 来正确地进行查询。

获取xml文档的代码

            private static XDocument GetXmlDataFromFileName(string fileName)
            {
                // read the xml file into memory
                return XDocument.Load(new FileStream(String.Format(@"C:\<some path>\{0}.xml", fileName), FileMode.Open));
            }

.Value 的扩展方法,因此它会修剪不必要的结果,但我用它来处理末尾的空格,或者如果该值不存在空字符串。

public static class XmlExtensions
{
    public static String ValueTrim(this XElement element)
    {
        return element != null ? element.Value.Trim() : "";
    }
}

将xml数据读入对象的代码

            // read the xml file into memory
            var doc = GetXmlDataFromFileName("FormsPersistence");
            var data = (from attrib in doc.Descendants("FormsPersistenceDs").Descendants("Properties")
                        select new FormsPersistence
                        {
                            Id = Guid.NewGuid(),
                            FormName = attrib.Element("FormName").ValueTrim(),
                            ControlName = attrib.Element("ControlName").ValueTrim(),
                            Property = attrib.Element("Property").ValueTrim(),
                            PropertyValue = attrib.Element("PropertyValue").ValueTrim()
                        }).ToList();

文件模板

<?xml version="1.0" standalone="yes"?>
<FormsPersistenceDs>
  <Properties>
    <FormName>Form1</FormName>
    <ControlName>mainNaviBar</ControlName>
    <Property>Width</Property>
    <PropertyValue>275</PropertyValue>
  </Properties>
</FormsPersistenceDs>

关于c# - 如何使用 Linq 读取 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16038168/

相关文章:

c# - 为什么resharper建议const,静态操作?

c# - ASP.NET 从远程共享发送 PDF 文件给用户打开

ASP.net GridView 获取数据库值

c# - 为什么我在 vb 中得到不明确的调用,而在 c# 中却没有?

vb.net - 从工作线程更新 UI 表单

c# - Visual Studio 解决方案不可用(重新加载不起作用)

c# - 对索引器属性使用 Moq 会导致 CaSTLe 出现 InvalidCastException

xml - 根据其他 XML 字段的值在 XSD 中设置 minOccurs 和 maxOccurs?

xml - 使用 XPath 进行挑选

android - 适用于手机和平板电脑