【问题标题】:Removing header in xml file required?需要删除 xml 文件中的标题?
【发布时间】:2018-07-11 16:07:43
【问题描述】:

我有下面的 xml 文件,我想使用 LINQ to XML 从 Instrmt 元素中检索 sym 属性。为此,我是否必须删除第一行:FIXML 元素?

如果我这样做了,那么下面的代码就可以了:

IEnumerable<string> symbols = from c in xml.Descendants("Instrmt")
                              select (string)c.Attribute("Sym");

这是xml。

<FIXML r="20030618" s="20040109" v="4.4" xr="FIA" xv="1" xmlns="http://www.fixprotocol.org/FIXML-4-4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://www.fixprotocol.org/FIXML-4-4 https://optionsclearing.com/components/docs/membership/dds_ref/fia_1_1/fixml-main-4-4-FIA-1-1.xsd">
  <Batch>
    <SecList ListTyp="109" ListID="20175" BizDt="2017-12-07">
      <SecL Ccy="USD">
       <Instrmt Desc="iShares S&amp;P 100 ETF" SecTyp="OPT" SubTyp="ETO" Sym="OEF" Mult="100.0">
         <AID AltID="00013" AltIDSrc="RBHP"/>
       </Instrmt>
       <InstrmtExt>
         <Attrb Typ="101" Val="1.0000"/>
         <Attrb Typ="108" Val="1.0000"/>
       </InstrmtExt>
       <Undly Desc="iShares S&amp;P 100 ETF" Px="117.110000" Ccy="USD" Sym="OEF" ID="464287101" Src="1"/>
       <Stip Typ="RBHMIN" Val="2.500"/>
       <Stip Typ="CPMMIN" Val="3.750"/>
      </SecL>
   </SecList>
  </Batch>
</FIXML>

【问题讨论】:

  • 您的代码在没有删除标题的情况下为我工作,您的问题是什么?
  • 我用实际存在的标题更新了原始问题。这给符号计数为 0。

标签: c# xml linq-to-xml


【解决方案1】:

好的,您的问题不在于标头,而在于名称空间(由 xmlns 属性定义)。当您的 xml 定义一个时,您的所有 xml 子元素都将其作为默认值。试试下面的代码:

var xml = XDocument.Load(pathToFile);
XNamespace ns = xml.Root.GetDefaultNamespace();
IEnumerable<string> symbols = from c in xml.Descendants(ns + "Instrmt")
                              select (string)c.Attribute("Sym");

【讨论】:

  • 你知道有一篇文章解释了为什么需要这样做吗?
  • @rds80 不是文章,但您可以使用 google xml 命名空间。最重要的是,在 xml 中,您可以有不同的作者为不同的事物定义相同的元素名称,并且您可以有一个使用这两个元素的 xml。因此,为了区分它们,您需要定义命名空间。当您没有为元素指定命名空间时,它使用默认值。当您定义时,它的所有子项都将使用它作为默认值,因此您不必在整个文档中指定相同的命名空间。
  • 作为更新,我不得不使用 XMLTextReader,因为 XDocument.Load 给出了内存不足异常错误,因为 XML 文件的大小超过了一个 gig。
猜你喜欢
  • 2019-10-03
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多