【问题标题】:XDocument losing line numberXDocument 丢失行号
【发布时间】:2014-07-04 08:50:59
【问题描述】:

我正在使用XDocument 来解析我的XML 文件,但是当我尝试读取XNodeXElement 的行号时,它总是等于0。

我尝试了不同的方法来解析它:

foreach (XElement node in xDoc.Root.Descendants("nodeName"))

xDoc.XPathSelectElement("nodeName")

并且每次((IXmlLineInfo)node).LineNumber 返回 0!

我正在使用XmlNamespaceManager

我错过了什么吗?

提前致谢!

编辑:

这是所询问的相关Xml。

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
<CstmrDrctDbtInitn>
<GrpHdr>
  <MsgId>XXXXXXXXX</MsgId>
  <CreDtTm>2013-06-12T00:00:00</CreDtTm>
  <NbOfTxs>1</NbOfTxs>
  <CtrlSum>136.82</CtrlSum>
  <InitgPty>
    <Nm>name</Nm>
    <Id>
      <OrgId>
        <Othr>
          <Id>XXXXXXXXX</Id>
        </Othr>
      </OrgId>
    </Id>
  </InitgPty>
</GrpHdr>
<PmtInf>
  <PmtInfId>275-20130612-FIRST</PmtInfId>
  <PmtMtd>DD</PmtMtd>      
  <BtchBookg>true</BtchBookg>
  <NbOfTxs>1</NbOfTxs>
  <CtrlSum>136.82</CtrlSum>
  <PmtTpInf>
    <SvcLvl>
      <Cd>SEPA</Cd>
    </SvcLvl>
    <LclInstrm>
      <Cd>CORE</Cd>
    </LclInstrm>
    <SeqTp>RCUR</SeqTp>
  </PmtTpInf>
  <ReqdColltnDt>2013-06-05</ReqdColltnDt>
  <Cdtr>
    <Nm>name</Nm>
    <PstlAdr>
      <Ctry>BE</Ctry>
      <AdrLine>XXXXXXXXX</AdrLine>
      <AdrLine>XXXXXXXXX</AdrLine>
    </PstlAdr>
  </Cdtr>
  <CdtrAcct>
    <Id>
      <IBAN>XXXXXXXXX</IBAN>
    </Id>
  </CdtrAcct>
  <CdtrAgt>
    <FinInstnId>
      <BIC>XXXXXXXXX</BIC>
    </FinInstnId>
  </CdtrAgt>
  <ChrgBr>SLEV</ChrgBr>
  <CdtrSchmeId>
    <Id>
      <PrvtId>
        <Othr>
          <Id>XXXXXXXXX</Id>
          <SchmeNm>
            <Prtry>SEPA</Prtry>
          </SchmeNm>
        </Othr>
      </PrvtId>
    </Id>
  </CdtrSchmeId>
  <DrctDbtTxInf>
    <PmtId>
      <InstrId>XXXXXXXXX</InstrId>
      <EndToEndId>XXXXXXXXX</EndToEndId>
    </PmtId>
    <InstdAmt Ccy="EUR">136.82</InstdAmt>
    <DrctDbtTx>
      <MndtRltdInf>
        <MndtId>XXXXXXXXX</MndtId>
        <DtOfSgntr>2009-10-31</DtOfSgntr>
        <AmdmntInd>false</AmdmntInd>
        <AmdmntInfDtls>
          <AmdmntInd>yellowland</AmdmntInd>
          <OrgnlMndtId>XXXXXXXXX</OrgnlMndtId>
          <OrgnlCdtrSchmeId>
            <Id>
              <PrvtId>
              <Othr>
                <Id>XXXXXXXXX</Id>
                <SchmeNm>
                <Prtry>SEPA</Prtry>
                </SchmeNm>
                </Othr>
              </PrvtId>
            </Id>
          </OrgnlCdtrSchmeId>
        </AmdmntInfDtls>
      </MndtRltdInf>
    </DrctDbtTx>
    <DbtrAgt>
        <FinInstnId>
            <BIC>XXXXXXXXX</BIC>
        </FinInstnId>
    </DbtrAgt>
    <Dbtr>
      <Nm>TEST</Nm>
      <PstlAdr>
        <Ctry>BE</Ctry>
        <AdrLine>XXXXXXXXX</AdrLine>
        <AdrLine>XXXXXXXXX</AdrLine>
      </PstlAdr>
    </Dbtr>
    <DbtrAcct>
      <Id>
        <IBAN>XXXXXXXXX</IBAN>
      </Id>
    </DbtrAcct>
    <RmtInf>
      <Ustrd>test</Ustrd>
    </RmtInf>
  </DrctDbtTxInf>
</PmtInf>
</CstmrDrctDbtInitn>
</Document>

【问题讨论】:

  • 你能分享一些你的 XML 文件吗
  • 并非所有 XElements 都有 lineinfo,对 HasLineInfo 的调用会产生什么?但是,当您从文件中解析时,我希望它会。鉴于XElement 继承,你为什么要投射到IXmlLineInfo 顺便说一句?
  • HasLineInfo 返回 false。除了(node as IXmlLineInfo).LineNumber之外,检索XElement的行号的其他方法是什么?

标签: c# xml linq-to-xml


【解决方案1】:

当您通过XDocument 加载 xml 时,并不总是加载 LineInformations。

您需要指定在加载 XML 时还希望加载 LineInformation。这是通过使用Load 方法之一完成的,您可以传入XDocument 类的LoadOptions 值。

var document = XDocument.Load(file, LoadOptions.SetLineInfo);

【讨论】:

    【解决方案2】:

    来自here

    XDocument xdoc = XDocument.Load(file);
    IEnumerable<XElement> nodes = xdoc.Descendants("nodeName");
    foreach (XElement node in nodes)
    {
        IXmlLineInfo info = node;
        int lineNumber = info.LineNumber;
    }
    

    【讨论】:

    • 谢谢 luliaa 但这正是我的问题。 info.LineNumber始终为零。
    • @SeyoS 有点晚了......但是,我遇到了同样的问题。如果您在@Iuliia 的回答中这样做,那它就行不通了。您需要以这种方式将 XElement 项显式转换为 IXmlLineInfo:IXmlLineInfo info = (IXmlLineInfo)node; int lineNumber = info.HasLineInfo() ? info.LineNumber : -1;。所以它有效!也看看here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 2013-05-10
    • 2016-01-15
    • 1970-01-01
    相关资源
    最近更新 更多