1

我需要知道如何将 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,只是在示例中)并且在名为Test.xml 的App_Code 文件夹中保存了一个测试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 文件。

4

1 回答 1

2

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

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

这设置resultsXmlNodeList包含 的所有子节点someNode。您可以results作为ListXmlNodes 进行迭代。然后,您可以在每个节点上执行与第 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
    }
}
于 2012-10-31T16:39:55.440 回答