【问题标题】:Read XML elements from a specific node从特定节点读取 XML 元素
【发布时间】:2022-11-10 02:36:07
【问题描述】:

这里是 XML 文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyResponse xmlns="http://mynamespace">
    <Header>
        <FirstName>David</FirstName>
        <LastName>Duchovny</LastName>
    </Header>
    <Filmography>
        <Films>     
        </Films>
        <Series>
            <Serie>
                <Title>X-Files</Title>
                <Year>1989</Year>
            </Serie>
        </Series>

    </Filmography>  
</MyResponse>

我只想得到这个对象的 Header 部分:

public class Header
{
    public string FirstName { get; set; }

    public string LastName { get; set; }
}

我这样做了(我们不能使用反序列化):

const string nameSapce = "http://mynamespace">
var xmlDocument = new XmlDocument();
xmlDocument.Load(@"c:\temp\csv.xml");
var namespaceManager = new XmlNamespaceManager(xmlDocument.NameTable);
namespaceManager.AddNamespace("myApplication", nameSapce);
XmlNode node = xmlDocument.DocumentElement.SelectSingleNode("//myApplication:MyResponse", namespaceManager);
Console.WriteLine(node);

我在node 变量中得到了这个结果:

<Header xmlns="http://mynamespace">
    <FirstName>David</FirstName>
    <LastName>Duchovny</LastName>
</Header>

如何将 Header 项目提取到 Header 对象?

【问题讨论】:

    标签: c# .net xml parsing


    【解决方案1】:

    你有没有尝试过LINQ 转 XML,您可以将它与选择标题来自 xml 对象的类,

    例子: https://learn.microsoft.com/en-us/dotnet/standard/linq/linq-xml-overview

    【讨论】:

      【解决方案2】:

      您可以考虑将LINQ 与 xml 与 xml 反序列化结合起来。

      XNode 有一个 CreateReader 方法,可以在反序列化时充当 XmlSerializer 的源。

      var xml = XElement.Load(@"@"c:	empcsv.xml");
      XNamespace xns = "http://mynamespace";
      
      var serializer = new XmlSerializer(typeof(Header));
      var header = serializer.Deserialize(
          xml.Element(xns + "Header").CreateReader()
          ) as Header;
      

      请注意,您必须使用 XmlRoot 属性装饰 Header 以设置匹配的 xml 命名空间。

      [XmlRoot(Namespace = "http://mynamespace")]
      public class Header
      {
         public string FirstName { get; set; }
      
         public string LastName { get; set; }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-03-30
        • 1970-01-01
        • 2013-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-28
        相关资源
        最近更新 更多