0

我有一个如下所示的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="https://www.someurl.com/somefile.xslt"?>
<AutoInsuranceClaim xmlns="http://www.someurl.com/schemas/AutoInsuranceClaim">
    <Identification>
        <BaseOwner>3</BaseOwner>
        <BaseType>ABC123</BaseType>
        <BaseTypeRef>471038341757</BaseTypeRef>
    </Identification>
</AutoInsuranceClaim>

我正在尝试读取标识节点。这是我的代码:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"..\..\Data.xml");

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
nsmgr.AddNamespace("ns", "http://www.someurl.com/schemas/AutoInsuranceClaim");

XmlNodeList nodeList = xmlDoc.SelectNodes(@"/ns:AutoInsuranceClaim/Identification", nsmgr);

Console.WriteLine("There are {0} nodes...", nodeList.Count);

我知道我应该得到至少 1 个值。我对 .NET XML 解析的理解是,如果您有一个没有前缀的默认命名空间,则必须创建自己的命名空间。但这应该返回 1。

如果没有,我错过了什么?

4

3 回答 3

2
        XElement root = XElement.Load("Data.xml");
        var identifications = root.Descendants()
           .Where(x => x.Name.LocalName == "Identification")
           .ToList()
于 2012-08-15T19:33:30.007 回答
2

我可能在这里抓住了稻草,但是您不应该在 xpath 表达式中对两个实体进行命名空间吗?

XmlNodeList nodeList = xmlDoc.SelectNodes(@"/ns:AutoInsuranceClaim/ns:Identification", nsmgr);
于 2012-08-15T19:29:06.510 回答
1

问题是您正在尝试查找没有Identification命名空间的节点,但由于该部分,它将默认为与父节点相同的命名空间。尝试这个:xmlns=...

var nodeList = xmlDoc.SelectNodes("/ns:AutoInsuranceClaim/ns:Identification", 
                                  nsmgr);

自己尝试过,它打印的计数为 1。

不过,我个人会改用 LINQ to XML,这使得命名空间更容易处理:

XDocument doc = XDocument.Load(@"..\..\Data.xml");
XNamespace ns = "http://www.someurl.com/schemas/AutoInsuranceClaim";
var nodes = doc.Root.Elements(ns + "Identification");
于 2012-08-15T19:28:37.157 回答