C#中的复杂/嵌套XML阅读

时间:2020-08-07 15:22:42

标签: c# xml linq nested

我一直在尝试读取此XML文件,但是与我在网上看到的示例相比,它很复杂/嵌套很多。我曾经尝试过使用LINQ和XMLReader,但是没有运气。

LINQ将读取每个OrderScreen;但是,涉及到每个OrderScreen的单元格时,即使该单元格不属于该OrderScreen,它也会将所有可能的单元格加载到每个OrderScreen中。我知道为什么会这样做,但是我对LINQ还是陌生的,我看到的大多数示例都不是那么复杂,因此并没有真正涵盖这方面。

XMLReader可以很好地工作,但是在完成一个OrderScreen的读取之后,它不会继续读取下一个Cell,它只是读取下一个OrderScreen的第一个Cell,然后假定它位于文档的末尾。我未包含该代码,因为我看到人们使用LINQ over XMLReader进行的所有搜索。

XML位于最下面,之后是最新的LINQ代码

非常感谢您的帮助!

<Screens>
  <DeleteScreens></DeleteScreens>
  <NewScreens>
    <OrderScreen>
      <ScreenNumber></ScreenNumber>
      <Title></Title>
      <NumberOfColumns></NumberOfColumns>
      <OptionScreen></OptionScreen>
      <ShowQuantityButtons></ShowQuantityButtons>
      <PrepSequenceScreen></PrepSequenceScreen>
      <Cell>
        <CellNumber></CellNumber>
        <CellName></CellName>
        <InventoryNumber></InventoryNumber>
        ...more Cell elements..
        <OptionGroup>
          <Type></Type>
          <ScreenNumber></ScreenNumber>
          <Cells></Cells>
        </OptionGroup>
        ...more OptionGroups...
      </Cell>
      ...more Cells...
    </OrderScreen>
    ...more OrderScreens...
  </NewScreens>
  <UpdateMenus>
     <Menu>
      <MenuNumber></MenuNumber>
      <MenuTitle></MenuTitle>
      ...more Menu elements...
    </Menu>
    ...more Menus...
  </UpdateMenus>
<Screens>

XDocument xdoc;
xdoc = XDocument.Load(@"C:\Users\Kwagstaff\Desktop\PMM_3.0\PMM_3.0\XML\Screens.xml");
var ORDERSCREENS = from a in xdoc.Descendants("OrderScreen")
 select new
 {
  ScreenNumber = a.Element("ScreenNumber").Value,
  Title = a.Element("Title").Value,
  NumberOfColumns = a.Element("NumberOfColumns").Value,
  OptionScreen = a.Element("OptionScreen").Value,
  ShowQuantityButtons = a.Element("ShowQuantityButtons").Value,
  PrepSequenceScreen = a.Element("PrepSequenceScreen").Value,
  Cell = from b in xdoc.Descendants("Cell")
  select new
  {
   CellNumber = b.Element("CellNumber"),
  }   
};

1 个答案:

答案 0 :(得分:0)

我认为,正确的处理方法是使用实​​体和装饰器,但您需要做一些研究,但作为示例

类似

<MyComplexXML>
....
   <xalAddress>...</xalAddress>
   <multiPoint>
     <MultiPoint>...</MultiPoint>
   </multiPoint>
...
</MyComplexXML>

首先,您要像这样创建课程

using System.Xml.Serialization;

namespace MyComplexXML_Model
{
    /// <summary>
    /// Address field for MyComplexXML
    /// </summary>
    public class Address
    {
        /// <summary>
        /// XalAddress
        /// </summary>
        [XmlElement("xalAddress")]
        public XalAddress XalAddress;
        [XmlElement("multiPoint")]
        public MultiPointAddress MultiPointAddress;
    }
}

using System.Xml.Serialization;

namespace MyComplexXML_Model
{

    public class MultiPointAddress
    {
        [XmlElement("MultiPoint", Namespace = "http://www.sample.net/sample")]
        public MultiPoint Multipoint;
    }
}

,当您拥有完整的层次结构时,您可以像这样调用根元素

  var ns = new XmlSerializerNamespaces();
    ns.Add("sample", "http://www.sample.net/sample");
    ...

    var ms = new MemoryStream();
    var sw = new StreamWriter(ms);

    //Deserialize from  file 
    var sr = new StreamReader(@"myfile.xml");
    var city = (MyComplexXML)new XmlSerializer(typeof(MyComplexXML)).Deserialize(sr);

希望这会为您指明正确的方向。

相关问题