【问题标题】:How to get innertext in an XML如何在 XML 中获取内部文本
【发布时间】:2013-06-01 12:57:10
【问题描述】:

我有以下 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<Comprobante version="2.2" serie="A" folio="35207" fecha="2013-05-31T11:51:48">
 <Emisor rfc="" nombre="E">
  <DomicilioFiscal calle="" noExterior="" colonia="" />
  <ExpedidoEn calle="" noExterior="" colonia="" />
  <RegimenFiscal Regimen="Regimen" />
 </Emisor>

 <Receptor rfc="" nombre="Z">
  <Domicilio calle="" noExterior="" colonia="" />
 </Receptor>

 <Conceptos cantidad="1.000" unidad="COMISION" descripcion="PENDIENTE" valorUnitario="28.50000" importe="28.50" />

 <Impuestos totalImpuestosTrasladados="3.14">
  <Traslados>
   <Traslado impuesto="IVA" tasa="11.00" importe="3.14" />
  </Traslados>
 </Impuestos>

 <Addenda>
  <ener:EstadoDeCuentaCombustible xmlns:ener="">
   <ener:cadenaOriginal>||2.2|A|35207|2013-05-31T11:51:48|773463|2011|ingreso|Pago en una sola exhibicion|28.50|31.64|Tarjeta|Tijuana,Baja California|3213|ERE|E S.A. de C.V.|Prol|13351|Anexa e|Tijuana|Tijuana|Baja California|Mexico|22100|Prol|13351|Anexa e|Tijuana|Tijuana|Baja California|Mexico|22100|Regimen|XA|Z||||TIJUANA|TIJUANA|BAJA CALIFORNIA|Mexico||1.000|COMISION|PENDIENTE|28.50000|28.50|IVA|11.00|3.14|3.14||</ener:cadenaOriginal>
   <ener:idRefund>98</ener:idRefund>
  </ener:EstadoDeCuentaCombustible>
 </Addenda>
</Comprobante>

我需要获取里面的文本(那个长字符串)

以下是我如何启动 c# 代码

XmlDocument doc = new XmlDocument();
doc.Load("Route");

XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable);

xnm.AddNamespace("Documento", "http://www.sat.gob.mx/cfd/2");
xnm.AddNamespace("ener", "http://www.enercard.com.mx/cfd");

我尝试了各种方法...

//strOriginalString = doc.DocumentElement.SelectSingleNode("//Documento:Addenda", xnm).FirstChild.SelectSingleNode("//ener:cadenaOriginal", xnm).InnerText;
//strOriginalString = doc.DocumentElement.SelectSingleNode("//Documento:Addenda//ener:EstadoDeCuentaCombustible", xnm).FirstChild.SelectSingleNode("//ener:cadenaOriginal", xnm).InnerText;
//strOriginalString = doc.DocumentElement.SelectSingleNode("//Documento:Addenda/Documento:cadenaOriginal", xnm).InnerXml;

这3种方式总是抛出异常...

我找到了另一种不抛出异常的方法,但它没有得到字符串

XmlElement root = doc.DocumentElement;
XmlNodeList nodes = root.SelectNodes("/Addenda/EstadoDeCuentaCombustible");
strOriginalString = "";

foreach (XmlNode node in nodes)
{
    XmlNode child = node.SelectSingleNode("./cadenaOriginal");

    if (child != null)
    {
        strOriginalString = child.InnerText;
        break;
    }
}

我做错了什么?还是有另一种方法可以让我得到里面的字符串

【问题讨论】:

  • 我很困惑。您的 XML 将 ener 命名空间前缀声明为空命名空间,但您的映射说明了其他内容。此外,映射具有 Documento 命名空间,但在您的文档中没有任何痕迹。

标签: c# xml xmlnode innertext


【解决方案1】:

您的第二次尝试看起来最接近应该起作用的方法:

//strOriginalString = doc.DocumentElement.SelectSingleNode("//Documento:Addenda//ener:EstadoDeCuentaCombustible", xnm).FirstChild.SelectSingleNode("//ener:cadenaOriginal", xnm).InnerText;

但是切换到这个(已编辑):

//strOriginalString = doc.SelectSingleNode("//ener:cadenaOriginal", xnm).InnerText;

【讨论】:

  • 抛出以下异常命名空间管理器或 XsltContext 需要。此查询具有前缀、变量或用户定义的函数。
  • 我应该把你的 ", xnm" 留在 SelectSingleNode 调用中;编辑答案
  • 我还应该注意,我确实必须编辑 xml 文件以包含 xmlns:ener 声明,就像其他人也提到需要的那样。
【解决方案2】:

我发现 Linq2Xml 更易于使用。 (假设您在 xmlns:ener="" 中有一个有效的命名空间)。

var xDoc = XDocument.Load(filename);
XNamespace ener = "your name space for ex ,http://www.enercard.com.mx/cfd";
var result = xDoc.Descendants(ener + "cadenaOriginal").First().Value;

【讨论】:

    【解决方案3】:

    您的 XML 文档中缺少 xmlns:ener 声明:

    <ener:EstadoDeCuentaCombustible xmlns:ener="http://www.enercard.com.mx/cfd">
    

    解决这个问题,你就可以使用这样的东西了:

    string xpath = "/Comprobante/Addenda/ener:EstadoDeCuentaCombustible";
    foreach (XmlNode estado in doc.SelectNodes(xpath, xnm))
    {
        Console.WriteLine("ener:cadenaOriginal={0}", 
            estado.SelectSingleNode("ener:cadenaOriginal", xnm).InnerText);
    }
    

    【讨论】:

      【解决方案4】:

      这有点简化,您需要处理命名空间问题(我在下面注明),但除此之外,这是基本结构:

              XmlDocument doc = new XmlDocument();
              try { doc.Load("c:\\temp\\test.xml"); }
              catch (Exception ex) { }
              XmlElement root = doc.DocumentElement;
              String strOriginalString = "";
      
              foreach (XmlNode node in root.SelectNodes("/Comprobante/Addenda"))
              {
                  XmlNode child = node.SelectSingleNode("EstadoDeCuentaCombustible/cadenaOriginal");
                  if (child != null)
                  {
                      strOriginalString = child.InnerText;
                      break;
                  }
              }
      

      &lt;ener:EstadoDeCuentaCombustible xmlns:ener=""&gt; 存在问题,因为空命名空间无效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-31
        • 2015-10-02
        • 2018-05-28
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        • 2012-06-02
        相关资源
        最近更新 更多