我有一个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.
如果没有,我错过了什么?
答案 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);