C# 包含多个不同文本元素的XML元素
我将以下元素作为XML文档的一部分:C# 包含多个不同文本元素的XML元素,c#,xml,C#,Xml,我将以下元素作为XML文档的一部分: 在每个if语句中,节点类型以文本形式返回,名称以空字符串形式返回 XML元素和其中的文本是不同的节点 您必须首先读取XML元素的内容简单示例: switch (reader.Name) { // found a node with name = "EntryNumber" (type = Element) case "EntryNumber": // make sure it's not the closing tag
在每个if语句中,节点类型以文本形式返回,名称以空字符串形式返回 XML元素和其中的文本是不同的节点 您必须首先读取XML元素的内容简单示例:
switch (reader.Name)
{
// found a node with name = "EntryNumber" (type = Element)
case "EntryNumber":
// make sure it's not the closing tag
if (reader.IsStartElement())
{
// read the text inside the element, which is a seperate node (type = Text)
reader.Read();
// get the value of the text node
propEntryNo = reader.Value;
}
break;
// ...
}
另一个选择是
当然,这些简单的示例假定XML是预期的格式。您应该在代码中包含适当的检查
至于其他建议的解决办法:
- 你可以或者相反。处理起来比较容易,但是()
- 将XML转换为对象是另一种选择。但我觉得处理由意外格式引起的错误比处理错误要复杂得多
XDocument
列出您的注册表项
class Program
{
static void Main(string[] args)
{
XDocument doc = XDocument.Load(@"C:\Users\xxx\source\repos\ConsoleApp4\ConsoleApp4\Files\XMLFile14.xml");
var registerEntries = doc.Descendants("RegisterEntry");
var result = (from e in registerEntries
select new
{
EntryNumber = e.Element("EntryNumber") != null ? Convert.ToInt32(e.Element("EntryNumber").Value) : 0,
EntryDate = e.Element("EntryDate") != null ? Convert.ToDateTime(e.Element("EntryDate").Value) : (DateTime?)null,
EntryType = e.Element("EntryType") != null ? e.Element("EntryType").Value : "",
EntryText = e.Element("EntryText") != null ? e.Element("EntryText").Value : "",
}).ToList();
foreach (var entry in result)
{
Console.WriteLine($"EntryNumber: {entry.EntryNumber}");
Console.WriteLine($"EntryDate: {entry.EntryDate}");
Console.WriteLine($"EntryType: {entry.EntryType}");
Console.WriteLine($"EntryText: {entry.EntryText}");
Console.WriteLine();
}
Console.ReadLine();
}
}
输出:
您还可以在列表中执行某些操作,如
//If you want to get all `EntryText` in xml to be comma separated then you can do like
string propEntryText = string.Join(", ", result.Select(x => x.EntryText));
//Get first register entry from xml
var getFirstRegisterEntry = result.FirstOrDefault();
//Get last register entry from xml
var getLastRegisterEntry = result.LastOrDefault();
//Get register entry from xml with specific condition
var getSpecificRegisterEntry = result.Where(x => x.EntryNumber == 3).SingleOrDefault();
您能给我们看一些代码吗?意味着您想获取RegisterEntry
中的所有子节点,无论它们是否存在?您的XML显示RegisterEntry
有子元素,那么它们怎么可能是文本节点?您的XML或解释不正确。显示代码!编辑原始帖子以包含代码。XML文件来自英国土地注册处。@AllenJones在99.9%的情况下,您实际上不需要使用XmlTextReader
。只要将此XML文件反序列化到对象中即可。如果使用DOM解析器,我可能建议使用XDocument
而不是XmlDocument
,因为API更易于使用。谢谢。我会尝试这个例子。谢谢,我也会尝试这些例子。@AllenJones,如果答案对你有帮助,那么在答案的左侧打勾,使其变为绿色,然后单击向上箭头向上投票以回答:)
switch (reader.Name)
{
case "EntryNumber":
propEntryNo = reader.ReadElementContentAsString();
break;
// ...
}
class Program
{
static void Main(string[] args)
{
XDocument doc = XDocument.Load(@"C:\Users\xxx\source\repos\ConsoleApp4\ConsoleApp4\Files\XMLFile14.xml");
var registerEntries = doc.Descendants("RegisterEntry");
var result = (from e in registerEntries
select new
{
EntryNumber = e.Element("EntryNumber") != null ? Convert.ToInt32(e.Element("EntryNumber").Value) : 0,
EntryDate = e.Element("EntryDate") != null ? Convert.ToDateTime(e.Element("EntryDate").Value) : (DateTime?)null,
EntryType = e.Element("EntryType") != null ? e.Element("EntryType").Value : "",
EntryText = e.Element("EntryText") != null ? e.Element("EntryText").Value : "",
}).ToList();
foreach (var entry in result)
{
Console.WriteLine($"EntryNumber: {entry.EntryNumber}");
Console.WriteLine($"EntryDate: {entry.EntryDate}");
Console.WriteLine($"EntryType: {entry.EntryType}");
Console.WriteLine($"EntryText: {entry.EntryText}");
Console.WriteLine();
}
Console.ReadLine();
}
}
//If you want to get all `EntryText` in xml to be comma separated then you can do like
string propEntryText = string.Join(", ", result.Select(x => x.EntryText));
//Get first register entry from xml
var getFirstRegisterEntry = result.FirstOrDefault();
//Get last register entry from xml
var getLastRegisterEntry = result.LastOrDefault();
//Get register entry from xml with specific condition
var getSpecificRegisterEntry = result.Where(x => x.EntryNumber == 3).SingleOrDefault();