Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 包含多个不同文本元素的XML元素_C#_Xml - Fatal编程技术网

C# 包含多个不同文本元素的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

我将以下元素作为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 (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();