【问题标题】:Complex/Nested XML Reading in C#C# 中的复杂/嵌套 XML 读取
【发布时间】:2020-08-07 15:22:42
【问题描述】:

我一直在尝试阅读这个 XML 文件,但是与我在网上看到的示例相比,它很复杂/嵌套了很多。我尝试过使用 LINQ 和 XMLReader,但没有成功。

LINQ 会读取每个 OrderScreen;然而,当涉及到每个 OrderScreen 的 Cell 时,它会将所有可能的 Cell 加载到每个 OrderScreen 中,即使该 Cell 不属于该 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"),
  }   
};

【问题讨论】:

  • 从:Cell = from b in xdoc.Descendants("Cell") 到:Cell = from b in a.Descendants("Cell")

标签: c# xml linq nested


【解决方案1】:

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

类似的东西

<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);

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2021-09-28
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
相关资源
最近更新 更多