2017-02-22 1 views
0

Ich habe eine ziemlich große XML-Datei von einer Computerdiagnosesitzung, und mein Ziel ist es, die Testergebnisdaten zu erfassen und für den Kunden in ein PDF zu pumpen. Ich habe sehr wenig Erfahrung mit XML und dies wird zu einem großen Problem. HierUntergeordnete Knoten in XML mit benutzerdefiniertem Namespace abrufen

ist eine Probe des Dokuments:

<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> 

Es gibt Tausende von Linien zwischen </Application> und <DiagInfo>, aber ich bin nur mit den Informationen in <DiagInfo> und <TestResult> gefunden.

Ich dachte, ich die Knoten einfach greifen könnte:

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); 

Aber dieses eine leere Liste zurückkehrt. Wenn ich auf Namespace Manager or XsltContext needed Bezug nehme, erscheint es erscheint Ich mache es richtig, aber ich glaube nicht, dass ich verstehe, einen Namespace korrekt hinzufügen. Wenn ich das Root-Element in nur ändern: <Diagnostics></Diagnostics> anstelle der <pcd:DiagLog>, und versuchen Sie: doc.SelectNodes("/Diagnostics/DiagInfo", manager); meine Knotenliste ist ausgefüllt.

Kann jemand sehen, wo ich den Namespace vermassele?

+0

@Tomalak das war ein Fehler durch Kopieren/Einfügen. Ich überprüfte den Code und die URIs stimmen überein. –

Antwort

1

Sie müssen das Namespacepräfix für alle Knoten in diesem Namespace verwenden.

Dies ist falsch: /pcd:DiagLog/DiagInfo.

Dies ist korrekt: /pcd:DiagLog/pcd:DiagInfo.

+0

Yup. Das war's. Ich kann das noch nicht als Antwort markieren, aber das hat funktioniert. –

+1

Standardnamespace propagieren. Explizite Namespaces nicht. Ihr XML verwendet einen Standardnamespace. Genau genommen, wenn kein Knoten in Ihrem Eingabe-XML das Präfix "pcd" verwendet, können Sie diese Namespace-Deklaration ohne negative Auswirkungen löschen. Sie müssen diesen Namespace 'pcd' auch nicht in C# aufrufen. Sie können jedem beliebigen Handle geben, nur die URIs müssen übereinstimmen. – Tomalak

Verwandte Themen