【问题标题】:How to use XML with WebMatrix razor (C#)如何将 XML 与 WebMatrix 剃须刀一起使用(C#)
【发布时间】:2012-10-31 16:28:06
【问题描述】:

我需要知道如何将 XML 与我使用的至少一种语言(最好是 WebMatrix C#)一起使用(特别是阅读),但我过去曾多次尝试使用 JavaScript 来做到这一点,但是没有在线示例(在 StackOverflow 或其他方式中)足够完整以使其对我有用(请记住,我没有实际的 XML 经验,我当然已经完成了有关 XPath、XML 等的简单教程,但我们都知道这些教程可以多么简短和不完整)。

我现在想在 WebMatrix C# 中执行此操作,因为在服务器端处理它似乎更易于管理且对用户来说更快。

当我尝试使用此代码使用在线给出的一些示例时:

@using System.Xml.Linq
@{
    var file = XDocument.Load(Server.MapPath(@"/App_Code/Test.xml"));
    var results = from e in file.Root.Elements() 
       select new { Name = e.Element("someValue").Value, Sales = e.Element("someValueTwo").Value };
    var grid = new WebGrid(results);
}

(我根本不需要使用WebGrid,只是在示例中) 并在 App_Code 文件夹中保存了一个名为 Test.xml 的测试 xml 文档。

尝试从 xml 文档中的两个字段读取一些测试值时出现错误。这是测试xml文档:

<?xml version="1.0" encoding="utf-8" ?>
<someNode>
    <someValue>HEY THERE! I'M XML!</someValue>
    <someValueTwo>Another Value</someValueTwo>
</someNode>

这里是我尝试在 cshtml 文件中将值调用到页面上的位置:

    <p>This should be a fun test!<br/>And the value is...:
        @foreach(var f in results)
        {
            <div>@f.Name</div>
            <div>@f.Sales</div>
        }
    </p>

最后,这是我在运行页面时遇到的错误(请记住,与此测试或使用 xml 相关的其他数据、代码或文件 [cs 或其他] 在我的站点中不存在):

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 


Line 4:      var file = XDocument.Load(Server.MapPath(@"/App_Code/Test.xml"));
Line 5:      var results = from e in file.Root.Elements() 
Line 6:         select new { Name = e.Element("someValue").Value, Sales = e.Element("someValueTwo").Value };
Line 7:      var grid = new WebGrid(results);
Line 8:  }

(第 6 行是错误所在的行)

我错过了什么?这些例子看起来真的很简单,但是很明显。不是。

老实说,我对 WebMatrix 的了解已经足够多,可以在不使用 XML 的情况下完成我的目标,(我总是可以只使用数据库,或渲染页面等),但我有点厌倦了这种标记语言躲避我,仅仅是因为我永远无法从我使用的任何语言(JavaScript、jQuery、C#)中读取 XML 文件。

【问题讨论】:

    标签: c# xml razor webmatrix


    【解决方案1】:

    我发现使用XmlDocumentXmlNodeXmlNodeList 类以及使用XPath 指定我想要的元素取得了更大的成功。但是,这需要您对 XML 文件的结构有一定的了解。

    var file = XmlDocument.Load(Server.MapPath(@"/App_Code/Test.xml"));
    var results = file.SelectNodes("someNode/*")
    

    这会将results 设置为包含someNode 的所有子节点的XmlNodeList。您可以将 results 作为 XmlNodes 的 List 进行迭代。然后,您可以在每个节点上执行与第 2 行中使用的查询类似的 XPath 查询,以获取子节点。

    XPath 语法:http://msdn.microsoft.com/en-us/library/aa926473.aspx

    对于以下使用 C# 而不是 VB.net,我深表歉意,但我不熟悉 VB 的 foreach 语法

    foreach(XmlNode aNode in results){
      string value = aNode.InnerText
    }
    

    会给你“嘿!我是 XML!”对于someValue 节点。\

    编辑:根据我在下面的评论中链接的内容试试这个:

    @using System.Xml.Linq
    @{
        var file = XmlDocument.Load(Server.MapPath(@"/App_Code/Test.xml"));
        var results = file.SelectNodes("someNode/*");
           select new { Name = e.Element("someValue").Value, Sales = e.Element("someValueTwo").Value };
        /*Do something with each node*/
        foreach(XmlNode aNode in results)
        {
           string value = aNode.InnerText
        }
    }
    

    【讨论】:

    • 哦,不用担心,我也不使用 VB.net。我也使用 C#,很好奇你为什么认为我使用 VB,但我喜欢你的回答,如果你用这种方法取得了更大的成功,我会理解的。至少对我来说似乎更有意义。
    • 我不认为这在 WebMatrix 中是这样工作的......不过谢谢你的尝试 :)
    • IntelliSense 在此处看不到某些方法(这意味着它们不存在、未导入或超出范围)
    • 我以为您使用的是 VB,因为您的代码部分使用 var。这里的函数都是 C# 的 System.Xml 的一部分。我从未使用过 WebMatrix。我的坏。我复制了你的代码。并将“XDocument”误读为“XmlDocument”我已经修复了我的代码。
    • 不,这可能适用于原始 C#,但不适用于 Webmatrix,尽管如此
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多