阅读RSS源的最佳方法是什么?
我XmlTextReader用来实现这一目标.有没有其他最好的方法呢?
XmlTextReader reader = new XmlTextReader(strURL);
DataSet ds = new DataSet();
ds.ReadXml(reader);
Run Code Online (Sandbox Code Playgroud)
看完后,RSS提要使用XmlTextReader,有没有什么办法可以填充数据ListItem,而不是DataSet?

我在C#中解析一些XML.我从数据库中获取它,因此在使用XmlTextReader读取它之前将其转换为MemoryStream.问题是我得到了这个错误:Name cannot begin with the ' ' character, hexadecimal value 0x20. Line 1, position 3.以下是我的XML和我的代码用于阅读它(它是从数据库出来的,没有空白的第一个字符).有什么建议?
XML:
<? xml version="1.0" encoding="utf-8" ?>
<form>
<e order="0" type="custom" name="test">
<fi type="text" />
<o />
</e>
<e order="1" type="zip" />
<e order="2" type="state" />
</form>
Run Code Online (Sandbox Code Playgroud)
C#:
byte[] byteArray = new byte[formXml.Length];
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
byteArray = encoding.GetBytes(formXml);
MemoryStream xmlStream = new MemoryStream(byteArray);
XmlTextReader xmlReader = new XmlTextReader(xmlStream);
while (xmlReader.Read())
{
if (xmlReader.HasValue)
{
returnString += xmlReader.Depth.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
我认为它可能是编码,但我尝试过UTF8和ASCII,但找不到任何东西.
我有一个XML字符串.我需要将此字符串转换为dotnet中的XMLTextReader(System.Xml.XMLTextReader)类型.
我使用了以下代码:
string szInputXml = "<TestDataXml><DataName>testing</DataName></TestDataXml>" ;
XmlTextReader reader = new XmlTextReader(new System.IO.StringReader(szInputXml));
Run Code Online (Sandbox Code Playgroud)
但执行后读取器内的字符串为空.
请帮我弄清楚需要做什么才能用给定的字符串填充XMLTextReader.
我能够在.NET中解析XML.现在我至少可以选择XmlTextReader和XDocument.这两者(或框架中包含的任何其他XML解析器)之间是否有任何比较?
也许这可以帮助我做出决定而不必深入尝试它们.
与易于使用相比,XML文件预计相当小,速度和内存使用是一个小问题.:-)
(我将从C#和/或IronPython中使用它们.)
谢谢!
我从第三方获得了一个我必须在我的应用程序中导入的XML文件,并且XML具有未转义和内部文本的元素,并且他们不会解决这个问题!所以我的问题是处理这个问题的最佳方法是什么?
这个XML非常大,而且修复速度必须很快,我的第一个解决方案就是用&符替换&字符,但实际上我不喜欢这个"解决方案",原因很明显.我不知道如何使用XmlStringReader与这样的XML,因为在这样的行上抛出异常,所以我不能在内部文本上使用HtmlEncode.我试图将XmlTextReader设置Settings.CheckCharacters为false但没有结果.
这是示例,&是元素,并且在该字段中可以是某些公司名称中的任何内容,因此我的替换修复可能不适用于其他公司名称,我想以某种方式使用HtmlEncode,但仅限关于内在文本当然.
<komitent ID="001398">
<sifra>001398</sifra>
<redni_broj>001398</redni_broj>
<naziv>LJUBICA & ŽARKO</naziv>
<adresa1>Odvrtnica 27</adresa1>
<adresa2></adresa2>
<drzava>HRVATSKA</drzava>
<grad>Zagreb</grad>
</komitent>
Run Code Online (Sandbox Code Playgroud) 我在XML文件上保存二维坐标,其结构类似于:
<?xml version="1.0" encoding="utf-8" ?>
<grid>
<coordinate time="78">
<initial>540:672</initial>
<final>540:672</final>
</coordinate>
</grid>
Run Code Online (Sandbox Code Playgroud)
我可以打开XML文件并通过XmlTextReader读取它,但是我如何专门遍历坐标以检索初始节点和最终节点之间的时间属性和数据,格式类似于:
string initial = "540:672";
string final = "540:672";
int time = 78;
Run Code Online (Sandbox Code Playgroud)
我的新代码:
//Read the XML file.
XDocument xmlDoc = XDocument.Load("C:\\test.xml");
foreach (var coordinate in xmlDoc.Descendants("coordinate"))
{
this.coordinates[this.counter][0] = coordinate.Attribute("time").Value;
this.coordinates[this.counter][1] = coordinate.Element("initial").Value;
this.coordinates[this.counter][2] = coordinate.Element("final").Value;
this.counter++;
};
Run Code Online (Sandbox Code Playgroud)
但现在我收到此错误:
"对象引用未设置为对象的实例."
XML
<?xml version="1.0" encoding="utf-8"?>
<grid>
<coordinate time="62">
<initial>540:672</initial>
<final>540:672</final>
</coordinate>
...
<coordinate time="46">
<initial>176:605</initial>
<final>181:617</final>
</coordinate>
</grid>
Run Code Online (Sandbox Code Playgroud)
跳过一些坐标标签以适应,但它们都有时间属性和初始/最终子标签.
全局
uint counter = 0;
// Coordinates to …Run Code Online (Sandbox Code Playgroud) 我从API中检索了一些XML(至少我认为是这样,服务器响应是'OK')但是我将响应流放入XmlTextReader中,如何将此XML输出为字符串?
static void ReadXml()
{
string a= null;
double b= 0;
double c= 0;
XmlReader xmlReader = new XmlReader("Testxml.xml");
xmlReader.
using (xmlReader)
{
if (xmlReader != null)
{
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element)
{
switch (xmlReader.Name)
{
case "a":
a = xmlReader.ReadElementContentAsString();
break;
case "b":
b = double.Parse(xmlReader.ReadElementContentAsString());
break;
case "c":
c = double.Parse(xmlReader.ReadElementContentAsString());
break;
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
TestXML内容:
<a><b>26a83f12c782</b><c>128</c><d>12</d></a>
Run Code Online (Sandbox Code Playgroud)
情况b从未被击中.但是如果我在b的结束元素之后添加一个空格,则会触发案例b.现在如何在不更改xml文件的情况下使其工作?
这可能是一个非常简单的事情,但我找不到它,我可能只是在寻找错误的东西......
XmlTextReader - >它会锁定你正在阅读的文件吗?我正在使用reader.Read(),而这就是它.
我是一名初学程序员,从C#和Web服务开始.
在Service.cs我的Web服务文件中,我创建了一个ReadXMLFile()方法,我尝试读取现有的XML文件,从中获取数据并将其放入我在IService.cs文件中创建的相应属性(DataMembers).
我的问题是我的代码基本上没有做任何事情.我已经尝试过寻找网站和教程,但实际上并没有太多,特别是像我这样的初学者.任何人都知道我应该怎么做,因为我到目前为止所做的事情显然是错误的.
以下是我的ReadXMLFile()方法.
void ReadXMLFile()
{
XmlTextReader reader = new XmlTextReader("ClassRoll.xml");
reader.Read();
while (reader.Read())
{
if (reader.Name == "id")
{
id = reader.ReadString();
}
else if (reader.Name == "firstname")
{
link = reader.ReadString();
}
else if (reader.Name == "lastname")
{
description = reader.ReadString();
}
else if (reader.Name == "count")
{
description = reader.ReadString();
}
else if (reader.Name == "testscore")
{
description = reader.ReadString();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的xml文件的一个例子
<classroll>
<student>
<id>101010</id>
<lastname>Smith</lastname> …Run Code Online (Sandbox Code Playgroud) 是否有最佳实践从XML文档中获取元素数量以用于进度报告?我有一个2 GB的XML文件,其中包含我需要处理的航班,我的想法是首先获取文件中所有元素的数量,然后使用计数器显示x个x航班被导入我们的数据库.
对于文件处理,我们使用.NET(C#)中的XmlTextReader来获取数据,而无需将整个文档读入内存(类似于sax解析).
所以问题是,我怎样才能非常快速地得到这些元素的数量......是否有最佳实践,或者我应该首先阅读整个文档并编写类似i ++的内容; ?
谢谢!
我正在努力使用一个合理的逻辑循环来从XML文件中剥离出太大的节点,以便与支持.NET类的XPath一起使用.
我试图用代码执行相同但使用XmTextReader替换我拥有的单行代码(使用XPath查询字符串调用SelectNodes).
我必须通过以前使用的XPath查询(仅供参考)说明几个级别:
ConfigurationRelease/Profiles/Profile[Name='MyProfileName']/Screens/Screen[Id='MyScreenId']/Settings/Setting[Name='MySettingName']
Run Code Online (Sandbox Code Playgroud)
我觉得这很烦人但很简单.但是,我似乎无法让循环正确.
我需要获取一个节点,检查其下的节点以查看该值是否与目标字符串匹配,然后再向下走(如果有)或跳过该分支(如果不匹配).
事实上,我认为我的问题是,如果我没有把它分开,我不知道怎么忽略一个分支.我不能允许它走不相关的分支,因为元素名称不是唯一的(如XPath查询所示).
我以为我可以维护一些布尔值,例如当我点击Profile节点时bool expectingProfileName设置为true.但是,如果它不是我想要的特定配置文件节点,我就无法离开那个分支.
所以...希望这对某人有意义......我一直在盯着这个问题几个小时,可能只是遗漏了一些明显的东西......
我想发布一部分文件,但无法弄清楚结构大致如何:
ConfigRelease > Profiles > Profile > Name > Screens > Screen > Settings > Setting > Name
Run Code Online (Sandbox Code Playgroud)
我将知道ProfileName,ScreenName和SettingName,我需要设置节点.
我试图避免在一次点击中读取整个文件,例如在app启动时,因为其中的一半内容将永远不会被使用.我也无法控制生成xml文件的内容,因此无法更改它来生成多个较小的文件.
任何提示将不胜感激.
UPDATE
我重新打开了这个.一张海报建议XPathDocument应该是完美的.Unfortunatley,我没有提到这是一个移动应用程序,并且不支持XPathDocument.
大多数标准的文件并不大,这就是系统最初被编码为使用XmlDocument的原因.它目前是4MB,显然大到足以在移动应用程序加载到XmlDocument时崩溃.它可能就像它现在出现的那样,因为文件会变得更大.无论如何,我现在正在尝试DataSet建议,但仍然对其他想法持开放态度.
更新2
我有点怀疑,因为有不少人说他们不会指望这么大的文件会让系统崩溃.进一步的实验表明,这是间歇性的崩溃.昨天它每次都崩溃了,但今天早上我重置设备后,我无法重现它.我现在正试图找出一套可靠的生殖步骤.并且还决定了解决问题的最佳方法,我相信它仍然存在.我不能放弃它,因为如果应用程序无法访问此文件,它是无用的,我不认为可以告诉我的用户,当我的应用程序运行时,他们无法在他们的设备上运行任何其他内容... ....
我正在处理来自第三方的XML文件.这些文件偶尔会在其中包含无效字符,从而导致XMLTextReader.Read()异常.
我目前使用以下函数处理此问题:
XmlTextReader GetCharSafeXMLTextReader(string fileName)
{
try
{
MemoryStream ms = new MemoryStream();
StreamReader sr = new StreamReader(fileName);
StreamWriter sw = new StreamWriter(ms);
string temp;
while ((temp = sr.ReadLine()) != null)
sw.WriteLine(temp.Replace(((char)4).ToString(), "").Replace(((char)0x14).ToString(), ""));
sw.Flush();
sr.Close();
ms.Seek(0, SeekOrigin.Begin);
return new XmlTextReader(ms);
}
catch (Exception exp)
{
throw new Exception("Error parsing file: " + fileName + " " + exp.Message, exp.InnerException);
}
}
Run Code Online (Sandbox Code Playgroud)
我的直觉是说应该有一个更好/更快的方法来做到这一点.(是的,让第三方修复他们的XML会很棒,但目前还没有发生.)
编辑:这是最终解决方案,基于cfeduke的答案:
public class SanitizedStreamReader : StreamReader
{
public SanitizedStreamReader(string filename) : base(filename) { }
/* …Run Code Online (Sandbox Code Playgroud) xmltextreader ×13
c# ×10
xml ×7
.net ×4
asp.net ×1
coordinates ×1
grid ×1
linq-to-xml ×1
memorystream ×1
mobile ×1
rss ×1
string ×1
web-services ×1
xml-parsing ×1