C# 需要删除xml文件中的头吗?

C# 需要删除xml文件中的头吗?,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,下面是xml文件,我想使用LINQ to xml从Instrmt元素检索sym属性。为此,是否必须删除第一行:FIXML元素 如果我这样做了,那么下面的代码就起作用了: IEnumerable<string> symbols = from c in xml.Descendants("Instrmt") select (string)c.Attribute("Sym"); IEnumerable symbols=来自c的xm

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

如果我这样做了,那么下面的代码就起作用了:

IEnumerable<string> symbols = from c in xml.Descendants("Instrmt")
                              select (string)c.Attribute("Sym");
IEnumerable symbols=来自c的xml.substands(“Instrmt”)
选择(字符串)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>

好的,问题不在于标题,而在于名称空间(由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");
var xml=XDocument.Load(pathToFile);
XNamespace ns=xml.Root.GetDefaultNamespace();
IEnumerable symbols=来自xml.substands中的c(ns+“Instrmt”)
选择(字符串)c.Attribute(“Sym”);

好的,问题不在于标题,而在于名称空间(由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");
var xml=XDocument.Load(pathToFile);
XNamespace ns=xml.Root.GetDefaultNamespace();
IEnumerable symbols=来自xml.substands中的c(ns+“Instrmt”)
选择(字符串)c.Attribute(“Sym”);

你的代码在没有删除标题的情况下为我工作,你有什么问题吗?我用标题更新了原来的问题。符号计数为0。你的代码在没有删除标题的情况下为我工作,你有什么问题?我用实际存在的标题更新了原始问题。这表示符号的计数为0。您知道有一篇文章解释了为什么需要这样做吗?@rds80不是一篇文章,但您可以用谷歌搜索xml名称空间。总之,在xml中,可以有不同的作者为不同的事物定义相同的元素名,也可以有一个使用这两个元素的xml。因此,为了区分两者,您需要定义名称空间。如果不为元素指定名称空间,它将使用默认名称空间。当您定义时,它的所有子级都将使用它作为默认名称,因此您不必在整个文档中指定相同的名称空间。作为更新,我必须使用XMLTextReader,因为XDocument.Load给出了内存不足异常错误,因为XML文件的大小超过了gig。您知道有一篇文章解释了为什么需要这样做吗?@rds80不是一篇文章,但您可以用谷歌搜索XML名称空间。总之,在xml中,可以有不同的作者为不同的事物定义相同的元素名,也可以有一个使用这两个元素的xml。因此,为了区分两者,您需要定义名称空间。如果不为元素指定名称空间,它将使用默认名称空间。当您定义时,它的所有子项都将使用它作为默认名称,因此您不必在整个文档中指定相同的名称空间。作为更新,我必须使用XDocument.Load作为XDocument,因为XML文件的大小超过了gig,所以会出现内存不足异常错误。