我正在编写一个程序来解析一些第三方XML文件.结构就像......
<CharacterSheet>
...
<StatBlock>
...
<Stat>
...
<alias />
...
</Stat>
...
</StatBlock>
...
</CharacterSheet>
Run Code Online (Sandbox Code Playgroud)
我正在使用它来使用linq进行一些练习,我正在罚款我必须编写一些非常丑陋的链式查询来获得我想要的,统计列表及其所有别名.
var CharSheet = from i in character.Elements()
where i.Name == "CharacterSheet"
select i;
var StatBlocks = from sheet in CharSheet
from statBlock in sheet.Elements()
where statBlock.Name == "StatBlock"
select statBlock;
var stats = from statBlock in StatBlocks
from stat in statBlock.Elements()
select stat;
var statAliases = from stat in stats
from alias in stat.Elements()
where alias.Name == "alias"
select new { stat, alias }; …Run Code Online (Sandbox Code Playgroud) 我可能正在做一些真正愚蠢的事情,但我不能让这个工作:
var xmlQuery = from i in doc.Descendants("Item")
select new TriggerItem()
{
CreatedDate = DateTime.Now,
ItemIdentifier = i.Attribute("itemCode").Value,
Name = i.Attribute("name").Value,
ProductIdentifier = (i.Attribute("productCode") != null) ? i.Attribute("productCode").Value : null
};
Run Code Online (Sandbox Code Playgroud)
doc是一个Xdocument对象,在调试时,我可以确认它已经加载了以下xml:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Items xmlns="http://mywebsite">
<Item itemCode="12345" productCode="" name="testing" categoryId="">
</Item>
</Items>
Run Code Online (Sandbox Code Playgroud)
所以xmlQuery.Count()shud返回1,作为一个项目,但它一直返回0!
iv也尝试过:
xmlQuery = from i in doc.Descendants("Items")
Run Code Online (Sandbox Code Playgroud)
和
xmlQuery = from i in doc.Descendants("Item")
Run Code Online (Sandbox Code Playgroud)
即使没有创建新的TriggerItem对象,它也不会返回任何内容......任何想法?:'(
所以我有这个简单的XML文本:
<errors xmlns="http://schemas.google.com/g/2005">
<error>
<domain>GData</domain>
<code>InvalidRequestUriException</code>
<internalReason>You must specify at least one metric</internalReason>
</error>
</errors>
Run Code Online (Sandbox Code Playgroud)
提取internalReason元素值的最简单方法是什么?
我正在使用XML来保存一些设置,所以让我们使用以下示例:
<PermissionLevels>
<Permission Name="MyPermission 1" Bases="XXX" />
<Permission Name="MyPermission 2" Bases="XXX" />
</PermissionLevels>
Run Code Online (Sandbox Code Playgroud)
所以XXX是我的问题.我将拥有几个基本权限,例如"读取,创建,删除",我知道C#有.Split 方法,所以我可以尝试用","作为分隔符.我也可以有子节点<Permission>.
有没有正确的方法呢?正确的我的意思是:我不确定我是否应该使用LINQ(XDocument)或常规System.Xml变量(XmlDocument),我不确定是否有更好的处理方式.
随着.Split我将不得不采取的node.Attributes["Base"].Value,把它分解,并做了foreach所有元素的数组中-也许LINQ是更聪明,可以做不同的东西吗?
对不起我的漫无边际,这不是我的域名.问题实际上是:当我为一个属性设置多个值时,是否将它们与例如","连接起来,或者我是否以不同方式进行连接(例如,使用对象的子节点)?
private void alterNodeValue(string xmlFile, string parent, string node, string newVal)
{
XDocument xml = XDocument.Load(this.dir + xmlFile);
if (xml.Element(parent).Element(node).Value != null)
{
xml.Element(parent).Element(node).Value = newVal;
}
else
{
xml.Element(parent).Add(new XElement(node, newVal));
}
xml.Save(dir + xmlFile);
}
Run Code Online (Sandbox Code Playgroud)
为什么这会抛出
System.NullReferenceException未被用户代码处理
在这条线上
if (xml.Element(parent).Element(node).Value != null)
Run Code Online (Sandbox Code Playgroud)
?
我猜这是因为XML节点不存在,但这就是我们!= null要检查的内容.我该如何解决这个问题?
我已经尝试了几件事,他们在非空检查期间的某些时刻抛出相同的异常.
谢谢你的帮助.
.net c# exception-handling linq-to-xml nullreferenceexception
我正在尝试使用LINQ to Xml解析RSS feed
这是RSS供稿:http : //www.surfersvillage.com/rss/rss.xml
我的代码如下尝试解析
List<RSS> results = null;
XNamespace ns = "http://purl.org/rss/1.0/";
XNamespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
XDocument xdoc = XDocument.Load("http://www.surfersvillage.com/rss/rss.xml");
results = (from feed in xdoc.Descendants(rdf + "item")
orderby int.Parse(feed.Element("guid").Value) descending
let desc = feed.Element("description").Value
select new RSS
{
Title = feed.Element("title").Value,
Description = desc,
Link = feed.Element("link").Value
}).Take(10).ToList();
Run Code Online (Sandbox Code Playgroud)
为了测试代码,我在Linq查询的第一行放置了一个断点,并在中间窗口中使用以下命令对其进行了测试:
xdoc.Element(ns + "channel");
Run Code Online (Sandbox Code Playgroud)
这可以正常工作并返回预期的对象
我输入:
xdoc.Element(ns + "item");
Run Code Online (Sandbox Code Playgroud)
以上工作并返回了一个对象,但我正在寻找所有项目
所以我输入了..
xdoc.Elements(ns + "item");
Run Code Online (Sandbox Code Playgroud)
即使有超过10个项目,此操作也不返回任何内容,decendants方法也不起作用,并且还返回null。
谁能给我一些指出我要去哪里的地方的指针?我尝试过用rdf代替名称空间。
谢谢
我正在为我工作的公司开发Windows Phone 7应用程序.对于配置部分,我想分享用于我们的iPhone应用程序并存储在plist文件中的远程服务器上的配置.
我使用System.Xml.Linq.XDocument的Parse是使用WebClient实例下载的字符串.
这是代码:
Uri plistLocation = new
Uri(@"http://iphonevnreporter.vol.at/Settings.bundle/mw_test.plist");
WebClient client = new WebClient();
try
{
client.DownloadStringCompleted += ((sender,e) => {
if (e.Error == null)
{
XDocument xdoc = XDocument.Parse(e.Result);
//XElement element = XElement.Parse(e.Result.ToString());
var dictItems = xdoc.Descendants("dict");
foreach (XElement elem in dictItems)
{
}
}
});
}
catch (Exception e)
{
}
client.DownloadStringAsync(plistLocation);
Run Code Online (Sandbox Code Playgroud)
在这个例子中,plist只是dict在根元素下面有一个元素plist,然而我正在接收NotSupportedException.异常发生在XDocument.Parse(e.Result).
这是StackTrace:
at System.Xml.XmlTextReaderImpl.ParseDoctypeDecl()
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.Linq.XDeclaration..ctor(XmlReader r)
at System.Xml.Linq.XDocument.Load(XmlReader …Run Code Online (Sandbox Code Playgroud) 我是使用Linq到XML的新手,遇到了一个相当棘手的错误.当我试图拉入我的XML文件时,我收到一条错误,上面写着"对象引用未设置为对象的实例".并且它说错误是因为我试图使用select新语句.我在下面附上了我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Linq;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
XDocument feed = XDocument.Load(Server.MapPath("VEHICLES.XML"));
var query = from c in feed.Descendants("VEHICLES")
where (string) c.Element("VehicleType").Value == "0"
select new
{
Vin = c.Element("Vin").Value,
Status = c.Element("VehicleType").Value,
Year = c.Element("Year").Value
};
CarLister.DataSource = query;
CarLister.DataBind();
}
}
Run Code Online (Sandbox Code Playgroud)
使用select c,代码可以很好地拉入所有节点; 而不是selectnew,但理想情况下我只想选择某些信息,并且在拉入它们时我需要修改一些条目.我不确定是什么导致了这个问题所以任何指针或想法如何如果您需要任何其他信息,那么修复它会非常感激!
我已经看过这篇文章如何正确打开FileStream以供XDocument使用,但它没有帮助我,因为我没有本地硬盘驱动器上的文件的路径.这个XDocument正在传递给另一台计算机,因此BaseURI毫无价值.
我想知道如何在不使用本地文件路径的情况下将XDocument转换为FileStream.
我想能够使用XmlTextWriter或LINQ to XML编写XML文件,但我不希望文件被完全锁定.我想其他进程能够读取Xml文件.它应该仅在写入模式下锁定,以便其他人不能修改文件.实现这一目标的最佳方法是什么?