【问题标题】:Selecting a node from within an XML document?从 XML 文档中选择一个节点?
【发布时间】:2012-04-10 03:30:21
【问题描述】:

所以我有一个 xmlDocument,我需要检查是否附加了信用评分。为此,我使用 xmlNodes.SelectSingleNode,然后检查 innerText。

我的问题是:其中一个节点在实际节点名称中有一个 ID 字段。所以我认为 C# 将其解释为节点名称的一部分。

 public void DeperPostAppend()
    {
        DirectoryInfo CompDir = new DirectoryInfo(FilePrep.CompletedDirectory);

          foreach (FileInfo File in CompDir.GetFiles())
          {
              // Load xml documents for sorting
              XmlDocument xmlDoc = new XmlDocument();
              try
              {
                  xmlDoc.Load(File.FullName);
              }
              catch
              {
                  if (File.Extension != ".xml")
                      return;
              }

            //XmlNode auto = xmlDoc.SelectSingleNode("//ACORD//InsuranceSvcRq//PersAutoPolicyQuoteInqRq");
            XmlNode home = xmlDoc.SelectSingleNode("//ACORD//InsuranceSvcRq//HomePolicyQuoteInqRq");
            XmlNode creditAuto = xmlDoc.SelectSingleNode("//ACORD//InsuranceSvcRq//PersAutoPolicyQuoteInqRq//PersPolicy//CreditScoreInfo//CreditScore");
            XmlNode creditHome = xmlDoc.SelectSingleNode("//ACORD//InsuranceSvcRq//HomePolicyQuoteInqRq//PersPolicy//CreditScoreInfo//CreditScore");

                //if file is type home quote
            if (File.Extension == ".xml" && creditHome != null)
                {
                    if (creditHome.InnerText != "ERR" || creditHome.InnerText != "NOH")
                    {
                        DeperHome();
                    }
                }
                //If file is type Auto Quote
            else if (File.Extension == ".xml" && creditAuto != null)
                {
                    if (creditAuto.InnerText != "ERR" || creditAuto.InnerText != "NOH")
                    {
                        DeperAuto();
                    }
                }
          }

    }//end DeperPostAppend

//ACORD//InsuranceSvcRq//HomePolicyQuoteInqRq//PersPolicy//CreditScoreInfo//CreditScore

PersPolicy 是问题所在。节点在文档上看起来像这样。

<PersPolicy id="AE4562BEE086A92470D4">

我想忽略 id 部分,因为它会更改每个文档并且我有数千个文档要处理。

【问题讨论】:

  • id 字段等属性应该没有问题。您可以发布您的 XML 的虚拟版本吗?你也能得到这个//ACORD//InsuranceSvcRq//HomePolicyQuoteInqRq//的节点吗?如果是这样,这个//ACORD//InsuranceSvcRq//HomePolicyQuoteInqRq//的节点会变成空吗?
  • 查看顶部元素文档。它(或任何其他元素)是否具有xmlns 属性?如果是这样,则此伪属性声明一个不同于 XPath 的空名称空间的默认名称空间。这就是为什么你得到空的结果。命名空间 is 每个元素名称的一部分。

标签: c# fileinfo xmlnode selectsinglenode innertext


【解决方案1】:

我刚刚决定使用类来处理节点如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;


/// <summary>
/// 
/// </summary>

public class PersPolicy
{
    XElement self;
    public PersPolicy(XElement self) { this.self = self; }

    public CreditScoreInfo CreditScoreInfo { get { return _CreditScoreInfo ?? (_CreditScoreInfo = new CreditScoreInfo(self.Element("CreditScoreInfo"))); } }
    CreditScoreInfo _CreditScoreInfo;

    public string PolicyNumber
    {
        get { return (string)self.Element("PolicyNumber"); }
        set { self.Element("PolicyNumber").SetValue(value); }
    }
}

/// <summary>
/// 
/// </summary>
public class CreditScoreInfo
{
    XElement self;
    public CreditScoreInfo(XElement self) { this.self = self; }

    public string CreditScore
    {
        get { return (string)self.Element("CreditScore"); }
        set { self.Element("CreditScore").SetValue(value); }
    }
    public string CreditScoreDt
    {
        get { return (string)self.Element("CreditScoreDt"); }
        set { self.Element("CreditScoreDt").SetValue(value); }
    }
}

【讨论】:

    猜你喜欢
    • 2020-04-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多