0

I want go into a specific path '/trace/calls/call/userTableParameters/parameter' and take out all parameter names with values. I have used a namespace in xpath while doing xmlnode selection. It returns the right fisrt childnode 'parameter'. but xmlnodelist doesn't return any content further. What would be the problem in my code?

 XmlDocument doc = new XmlDocument();
    doc.Load(@"d:\Drops.xml");

    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
    nsmgr.AddNamespace("nsTrace", "http://www.polystar.com/OSIX/monitoring/traceSchemaV1.0");
    XmlNode ParameterNode = doc.SelectSingleNode("//nsTrace:userTableParameters", nsmgr);
    XmlNodeList ParameterNodeList = ParameterNode.SelectNodes("//parameter");

    foreach (XmlNode node in ParameterNodeList)
            {
                Parameter drop = new Parameter();
                drop.name = node.Attributes.GetNamedItem("name").Value;
                drop.content = node.InnerText;

                callParameter.ParameterList.Add(drop);
            }


    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<trace xmlns="http://www.polystar.com/OSIX/monitoring/traceSchemaV1.0">
    <calls>
        <call>
            <messages>
                <message>
                    <parameters>
                        <parameter name="Timestamp">Wed 11 Nov 2015 11:58:14.096</parameter>
                        <parameter name="Direction">---&gt;</parameter>
                        <parameter name="Resulting Status">Normal</parameter>
                        <parameter name="Resulting State Name">AP Request Pending</parameter>
                        <parameter name="Source Address">11.111.111.11</parameter>
                        <parameter name="Dest Address">11.222.222.22; ABC2</parameter>
                        <parameter name="Media Probe Id"/>
                        <parameter name="Deciphered"/>
                    </parameters>
                </message>  
            </messages>
            <userTableParameters>
                <parameter name="Start Time">11:58:14.096</parameter>
                <parameter name="End Time">11:58:27.191</parameter>
                <parameter name="Duration">00:00:13.095</parameter>
                <parameter name="Date">Wed 11 Nov 2015</parameter>
                <parameter name="Protocol">AP</parameter>
                <parameter name="Status">End</parameter>
                <parameter name="AP II"/>
                <parameter name="AP TI">e0a5e84d'H</parameter>
                <parameter name="AP Cause">3; due-to-generated-reason</parameter>
            </userTableParameters>
        </call>
    </calls>
</trace>
2
  • 1
    Try including the namespace in all the queries, e.g. XmlNodeList ParameterNodeList = ParameterNode.SelectNodes("//nsTrace:parameter"); Commented Nov 25, 2015 at 15:40
  • Another case of namespace overkill Commented Nov 25, 2015 at 17:46

1 Answer 1

1

Your Xpath query is wrong. I also shorten your code. More information about Xpath

XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("nsTrace","http://www.polystar.com/OSIX/monitoring/traceSchemaV1.0");
XmlNodeList ParameterNodeList = doc.SelectNodes("//nsTrace:userTableParameters//nsTrace:parameter", nsmgr);
Sign up to request clarification or add additional context in comments.

2 Comments

this is the trick to identify a correct xpath with namespace! "//nsTrace:userTableParameters//nsTrace:parameter". Is any MSDN or website could provide more examples and definitions?
actually i shared link(from w3school) in asnwer . You can also check these pages w3.org msdn @AnsonLeung

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.