使用自定义命名空间

时间:2017-02-22 21:12:37

标签: c# xml namespaces

我有一个来自计算机诊断会话的相当大的XML文件,我的目标是获取测试结果数据并将其输入到客户的PDF中。我对XML的经验很少,这是一个巨大的问题。

以下是文档的示例:

<pcd:DiagLog xmlns="http://www.pc-doctor.com/2004/8/diagLogger"
             xmlns:pcd="http://www.pc-doctor.com/2004/8/diagLogger"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.pc-doctor.com/2004/8/diagLogger 
             http://www.pc-doctor.com/2004/8/diagLogger/diagLogger.xsd">
    <Application>
        <version>6.0.6818.10</version>
        <Start>
            <Time hour="04" minute="14" second="01" millisecond="34" month="10" day="15" year="2016" utcOffset="-480">2016-10-15T04:14:01.034-08:00</Time>
        </Start>
        <OS>Windows 10 Service Pack 0 PE x86 32-bit</OS>
    </Application>
       .......
    <DiagInfo>
      ....
        <TestResult EnglishResult="PASS">
                ....
        </TestResult>
    </DiagInfo>

</Application><DiagInfo>之间有数千行,但我只关注<DiagInfo><TestResult>中的信息。

我以为我可以简单地抓住节点:

    XmlDocument doc = new XmlDocument();
    doc.Load(xmlFilePath);
    XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
    manager.AddNamespace("pcd", "http://www.pc-doctor.com/2004/8/diagLogger");
    XmlNodeList xnList = doc.SelectNodes("/pcd:DiagLog/DiagInfo", manager);

但是这会返回一个空列表。当我引用Namespace Manager or XsltContext needed时,显示我做得对,但我认为我并不理解正确添加命名空间。当我将根元素更改为:<Diagnostics></Diagnostics>而不是<pcd:DiagLog>时,请尝试:doc.SelectNodes("/Diagnostics/DiagInfo", manager);填充我的节点列表。

任何人都可以看到我搞砸了命名空间吗?

1 个答案:

答案 0 :(得分:1)

您需要为该命名空间中的所有节点使用名称空间前缀。

这是不正确的:/pcd:DiagLog/DiagInfo

这是正确的:/pcd:DiagLog/pcd:DiagInfo