C# 使用c将xml元素提取为字符串

C# 使用c将xml元素提取为字符串,c#,xml,C#,Xml,我有一个xml文件,如下所示: <Header> <CollectionDetails> <Collection></Collection> <Year>1415</Year> <FilePreparationDate></FilePreparationDate> </CollectionDetails> <Source> <ProtectiveMar

我有一个xml文件,如下所示:

  <Header>
<CollectionDetails>
  <Collection></Collection>
  <Year>1415</Year>
  <FilePreparationDate></FilePreparationDate>
</CollectionDetails>
<Source>
  <ProtectiveMarking>PROTECT-PRIVATE</ProtectiveMarking>
  <UKPRN></UKPRN>
  <TransmissionType>A</TransmissionType>
  <SoftwareSupplier></SoftwareSupplier>
  <SoftwarePackage></SoftwarePackage>
  <Release>12.0.2.3</Release>
  <SerialNo>01</SerialNo>
  <DateTime>2015-10-22T17:01:51.800</DateTime>
</Source>

您可以使用以下类将xml反序列化为C类对象,然后轻松访问任何属性以获得所需的值

POC代码:

[XmlRoot(ElementName="CollectionDetails")]
public class CollectionDetails {
    [XmlElement(ElementName="Collection")]
    public string Collection { get; set; }
    [XmlElement(ElementName="Year")]
    public string Year { get; set; }
    [XmlElement(ElementName="FilePreparationDate")]
    public string FilePreparationDate { get; set; }
}

[XmlRoot(ElementName="Source")]
public class Source {
    [XmlElement(ElementName="ProtectiveMarking")]
    public string ProtectiveMarking { get; set; }
    [XmlElement(ElementName="UKPRN")]
    public string UKPRN { get; set; }
    [XmlElement(ElementName="TransmissionType")]
    public string TransmissionType { get; set; }
    [XmlElement(ElementName="SoftwareSupplier")]
    public string SoftwareSupplier { get; set; }
    [XmlElement(ElementName="SoftwarePackage")]
    public string SoftwarePackage { get; set; }
    [XmlElement(ElementName="Release")]
    public string Release { get; set; }
    [XmlElement(ElementName="SerialNo")]
    public string SerialNo { get; set; }
    [XmlElement(ElementName="DateTime")]
    public string DateTime { get; set; }
}

[XmlRoot(ElementName="Header")]
public class Header {
    [XmlElement(ElementName="CollectionDetails")]
    public CollectionDetails CollectionDetails { get; set; }
    [XmlElement(ElementName="Source")]
    public Source Source { get; set; }
}
示例代码:

XmlSerializer serializer = new XmlSerializer(typeof(Header));
StreamReader reader = new StreamReader(path);
var header = (Header)serializer.Deserialize(reader);
reader.Close();
//use the header object to access your data
使现代化 下面是使用xpath的另一种方法:


这对于XDocument来说非常简单:

xns= var值=字符串单据子体SNS+年份单 其中,ns应设置为xmlns=。。。祖先元素中的属性,可能是文档根


我建议阅读更多关于如何使用API的解释。

您能澄清我想要去掉值的意思吗?现在还不清楚你想在这里实现什么。如果您只想将文件的全部内容作为字符串,只需使用file.ReadAllText而不是XDocument.Load…很抱歉,我错过了单词Year,out。修改了OPCODE示例。您的示例看起来非常短。一旦在文档中有了它,您就可以获取Root属性并以编程方式下降到Year节点。更灵活的解决方案是使用XPath;检查解释。好的,你需要找到正确的元素。你对此做过研究吗?我强烈建议你阅读微软的文章,我认为这只是为了增加一个元素的值,是一种巨大的过度使用。使用LINQ到XML真的很容易。谢谢。我听到一个错误,说System.InvalidOperationException:“序列不包含元素”。@voot89您可能需要提供XML的更多细节,最好编辑问题以包含完整的示例。我怀疑有一个xmlns=。。。属性设置根目录下的默认命名空间。有。对内容有关系吗?@voot89如果你想要一个准确的答案,它会的。我可以修改为“在此处插入内容”,否则,我现在将重新表述我原来的问题。
XmlSerializer serializer = new XmlSerializer(typeof(Header));
StreamReader reader = new StreamReader(path);
var header = (Header)serializer.Deserialize(reader);
reader.Close();
//use the header object to access your data
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.XPath;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            XPathNavigator nav;
            XPathDocument docNav;
            string xPath;

            docNav = new XPathDocument(AppDomain.CurrentDomain.BaseDirectory + "test.xml");
            nav = docNav.CreateNavigator();
            xPath = "/Header/CollectionDetails/Year/text()";

            string value = nav.SelectSingleNode(xPath).Value;
            Console.WriteLine(value);
        }
    }
}