我想在asp.net中使用c#读取xml文件并写入我试过这段代码
using (XmlReader reader = XmlReader.Create(Server.MapPath("TestXml.xml")))
{
reader.Read();
while (reader.Read())
{
Response.Write( reader.Value.ToString());
Response.Write("<br />");
}
}
,输出为:
,xml是
<?xml version="1.0" encoding="utf-8" ?>
<note>
<to>Chayem</to>
<from>Shaul</from>
<heading>Way?</heading>
<body>because</body>
</note>
我该怎么办?谢谢。
答案 0 :(得分:2)
XmlReader.Read()
始终处理文档中的下一个节点。注意:节点,而不是元素。如果您单步执行该代码并检查每个节点,您将看到虽然XML文档中只有六个元素,但XmlReader
正在处理11个节点。
这是因为您的XML文档(与大多数文档一样)的文本节点包含元素之间的空白字符。您的代码正在撰写<br/
&gt;每次XmlReader
遇到节点时的响应。每当XmlReader
遇到带有文本内容的元素时,你想要写出一个。
这样做的一种方法是简单地只写出包含空格以外的东西的节点,例如:
if (!string.IsNullOrEmpty(reader.Value.ToString().Trim())
{
Response.Write(reader.Value.ToString())
Response.Write("<br/>");
}
但为什么你甚至使用XmlReader
?有更简单的方法来生成此输出。例如,将XML加载到XDocument
中,您可以生成如下输出:
Response.Write(string.Join("<br/>", doc.Descendants()
.Where(x => (!string.IsNullOrEmpty(x.Value.ToString().Trim())
.Select(x => x.Value.ToString())
.ToArray());
答案 1 :(得分:0)
我认为问题在于XmlReader还会读取XML的\n
部分。
尝试使用以下内容:
using (XmlReader reader = XmlReader.Create(Server.MapPath("feedback.xml")))
{
while (reader.Read())
{
if (reader.Value == "\n")
{
Response.Write("<br />");
}
else
{
Response.Write(reader.Value);
}
}
}
编辑:您已经说过输出中每行之间的空格太多了。考虑到XmlReader还会读取\n
个字符,使用您的方法在结果中添加额外的空行。我的解决方案是仅在读者遇到新行时插入<br />
标记。
答案 2 :(得分:0)
写作示例:
public void WriteXml(List<string> filePaths, List<string> fileName)
{
//creating xml file
XmlElement mainNode, descNode;
XmlText pathText, nameText;
XmlDocument xmlDoc = new XmlDocument();
// Write down the XML declaration
XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
// Create the root element
XmlElement rootNode = xmlDoc.CreateElement("ImageStore");
xmlDoc.InsertBefore(xmlDeclaration, xmlDoc.DocumentElement);
xmlDoc.AppendChild(rootNode);
for (int i = 0; i < filePaths.Count; i++)
{
//Console.WriteLine("first xml image "+i);
// Create a new <Category> element and add it to the root node
XmlElement parentNode = xmlDoc.CreateElement("Image");
// Set attribute name and value!
parentNode.SetAttribute("ID", "01");
xmlDoc.DocumentElement.PrependChild(parentNode);
// Create the required nodes
mainNode = xmlDoc.CreateElement("URL");
descNode = xmlDoc.CreateElement("Name");
//XmlElement activeNode = xmlDoc.CreateElement("Active");
// retrieve the text
pathText = xmlDoc.CreateTextNode(filePaths[i]);
nameText = xmlDoc.CreateTextNode(fileName[i]);
XmlText activeText = xmlDoc.CreateTextNode("true");
// append the nodes to the parentNode without the value
parentNode.AppendChild(mainNode);
parentNode.AppendChild(descNode);
parentNode.AppendChild(activeNode);
// save the value of the fields into the nodes
mainNode.AppendChild(pathText);
descNode.AppendChild(nameText);
activeNode.AppendChild(activeText);
}//end of for loop
// Save to the XML file. Checks if previous file exist
if (File.Exists(Application.StartupPath + "/imageStore.xml"))
{
File.Delete(Application.StartupPath + "/imageStore.xml");
xmlDoc.Save(Application.StartupPath + "/imageStore.xml");
}
else
{
xmlDoc.Save(Application.StartupPath + "/imageStore.xml");
}
//return true;
}//end of writeXml
阅读例子:
XmlDocument doc = new XmlDocument();
doc.Load("./config.xml");
XmlNodeList configSet = doc.GetElementsByTagName("config");
foreach (XmlNode node in configSet)
{
XmlElement conElement = (XmlElement)node;
configData.Add("raw",conElement.GetElementsByTagName("raw")[0].InnerText);
//Console.WriteLine(raw + " space " + store + " space " + achieve + " space " + filter);
}
xml文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<ConfigFile>
<config>
<raw>./raw/</raw>
<store>./images/</store>
<achieve>./achieve/</achieve>
<filter>*.jpg;*.png;*.gif</filter>
</config>
</ConfigFile>
希望这有助于你