读取命名空间中的元素

时间:2012-08-15 19:24:38

标签: c# xml xml-namespaces

我有一个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.

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

3 个答案:

答案 0 :(得分:2)

我可能会在这里抓住吸管,但你不应该在xpath表达式中为两个实体命名吗?

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

答案 1 :(得分:2)

        XElement root = XElement.Load("Data.xml");
        var identifications = root.Descendants()
           .Where(x => x.Name.LocalName == "Identification")
           .ToList()

答案 2 :(得分:1)

问题在于您尝试在没有命名空间的情况下找到Identification节点,但由于{{1},它将默认为与父节点相同的命名空间部分。试试这个:

xmlns=...

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

我个人认为我会使用LINQ to XML,这使命名空间更容易处理:

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