簡體   English   中英

如何在XML標簽內獲取價值?

[英]How to get value inside XML tag?

我具有以下XML結構:

<Document>
  <Sectors>
    <Sector>
      SectorName1
      <Subsectors>
        <Subsector>Subsector1</Subsector> 
        <Subsector>Subsector2</Subsector> 
      </Subsectors>
    </Sector>
    <Sector>
      SectorName2
      <Subsectors>
        <Subsector>Subsector1</Subsector> 
        <Subsector>Subsector2</Subsector> 
      </Subsectors>
    </Sector>
  </Sectors>  
</Document>

我也有反序列化的類:

    public class MetaDataXML
    {
        public class SectorXML
        {
            [XmlArrayItem(ElementName = "Sector")]
            string SectorName { get; set; }

            [XmlArray]
            [XmlArrayItem(ElementName = "Subsector")]
            public List<string> Subsectors { get; set; }
        }

        public List<SectorXML> Sectors { get; set; }
    }

以及反序列化的部分代碼:

var xRoot = new XmlRootAttribute { ElementName = "Document", IsNullable = true };
var reader = new XmlSerializer(typeof(MetaDataXML), xRoot);
var data = (MetaDataXML)reader.Deserialize(streamXML);

反序列化之后,我成功地獲得了子部門的線索,但是我沒有獲得SectorName的值。 我該如何組織我的類結構,以便為我的字符串SectorName屬性獲取值“ SectorName1”和“ SectorName2”?


我發現這種情況是“混合內容”。 我們如何解析這些文本值?

盡管我不太確定您要在此處實現什么目的,但是我對XML類進行了一些修改,並在下面提供了一些示例代碼,該代碼能夠檢索有關扇區的所有信息,包括其名稱。以及其中所有子行業的名稱。

XML類別:

namespace DocumentXml
{
    [XmlRoot("Document")]
    public class Document
    {
        [XmlArray("Sectors")]
        [XmlArrayItem("Sector")]
        public Sector[] Sectors { get; set; }
    }

    [XmlRoot("Sector")]
    public class Sector
    {
        [XmlAttribute("SectorName")]
        public string SectorName { get; set; }
        [XmlArray("Subsectors")]
        [XmlArrayItem("Subsector")]
        public string[] Subsectors { get; set; }
    }
}

主程序類:

namespace DocumentXml
{
    class Program
    {
        static void Main(string[] args)
        {
            var path = @"D:\sandbox\DocumentXml\DocumentXml\Sample.xml";
            var serializer = new XmlSerializer(typeof(Document));
            var document = serializer.Deserialize(File.OpenRead(path)) as Document;
            var sectors = document.Sectors;
            foreach (var s in sectors)
            {
                Console.WriteLine($"Sector Name: {s.SectorName}");
                foreach (var ss in s.Subsectors)
                {
                    Console.WriteLine($"Subsector Name: {ss}");
                }
                Console.WriteLine();
            }
            Console.ReadKey();
        }
    }
}

樣本XML:

<Document>
  <Sectors>
    <Sector SectorName="SectorName1">
      <Subsectors>
        <Subsector>Subsector1</Subsector>
        <Subsector>Subsector2</Subsector>
      </Subsectors>
    </Sector>
    <Sector SectorName="SectorName2">
      <Subsectors>
        <Subsector>Subsector1</Subsector>
        <Subsector>Subsector2</Subsector>
      </Subsectors>
    </Sector>
   </Sectors>
</Document>

輸出:

控制台輸出


編輯

由於無法更改XML結構,因此該新類將保留該結構,並允許您獲取有問題的值。 XmlText返回值內的所有內容,因此必須使用自定義集來確保從中正確修剪了空格。

[XmlRoot("Document")]
public class MetaDataXml
{
    [XmlArray("Sectors")]
    [XmlArrayItem("Sector")]
    public Sector[] Sectors { get; set; }
}

[XmlRoot("Sector")]
public class Sector
{
    [XmlIgnore]
    private string _sectorName;

    [XmlText]
    public string SectorName
    {
        get
        {
            return _sectorName;
        }
        set
        {
            _sectorName = value.Trim();
        }
    }

    [XmlArray]
    [XmlArrayItem(ElementName = "Subsector")]
    public List<string> Subsectors { get; set; }
}

示例程序:

class Program
{
    static void Main(string[] args)
    {
        var path = @"D:\sandbox\DocumentXml\DocumentXml\Sample.xml";

        using (var stream = File.OpenRead(path))
        {
            var deserializer = new XmlSerializer(typeof(MetaDataXml));
            var data = (MetaDataXml)deserializer.Deserialize(stream);
            foreach (var s in data.Sectors)
            {
                Console.WriteLine($"Sector Name: {s.SectorName}");
                foreach (var ss in s.Subsectors)
                {
                    Console.WriteLine($"Subsector Name: {ss}");
                }
                Console.WriteLine();
            }
        }
        Console.ReadKey();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM