XDocument Reading XML file with Root element havin

2019-02-15 15:14发布

I am having some trouble parsing an XML file with the root node having multiple namespaces. I want to get a list of nodes 'object' with type string containing 'UserControlLibrary' :
XML File:

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.net 
http://www.springframework.net/xsd/spring-objects.xsd">

<!-- master pages -->
<object type="RLN.Site, RLN">
    <property name="ContainerBLL" ref="ContainerBLL"></property>
    <property name="UserBLL" ref="UserBLL"></property>
    <property name="TestsBLL" ref="TestsBLL"></property>
<property name="GuidBLL" ref="GuidBLL"></property>
</object>

<object type="RLN.UserControlLibrary.topleveladmin, RLN.UserControlLibrary">
    <property name="ContainerBLL" ref="ContainerBLL"></property>
    <property name="UserBLL" ref="UserBLL"></property>
    <property name="GuidBLL" ref="GuidBLL"></property>
</object>



<object type="RLN.UserControlLibrary.topleveladminfloat, RLN.UserControlLibrary">
    <property name="ContainerBLL" ref="ContainerBLL"></property>
    <property name="UserBLL" ref="UserBLL"></property>
</object>
</objects>

I have tried:

  XDocument webXMLResource = XDocument.Load(@"../../../../Web.xml");
  IEnumerable<XElement> values = webXMLResource.Descendants("object");

with no results being returned.

4条回答
Ridiculous、
2楼-- · 2019-02-15 15:14

One more trick with namespaces - you can use XElement.GetDefaultNamespace() to get default namespace of root element. Then use this default namespace for querying:

var xdoc = XDocument.Load(path_to_xml);
var ns = xdoc.Root.GetDefaultNamespace();
var objects = xdoc.Descendants(ns + "object");
查看更多
闹够了就滚
3楼-- · 2019-02-15 15:20

When you call Decendants with a XName parameter the XName'sNameSpace (which happened to be empty) is actually incorporated into the Name in addition to LocalName. So you can query just byLocalName

p.Descendants().Where(p=>p.Name.LocalName == "object")
查看更多
来,给爷笑一个
4楼-- · 2019-02-15 15:21

Try using the namespace:

var ns = new XNamespace("http://www.springframework.net");
IEnumerable<XElement> values = webXMLResource.Descendants(ns + "object");
查看更多
Lonely孤独者°
5楼-- · 2019-02-15 15:25

If you are using decedent than you have to add name space like below

 XDocument webXMLResource = XDocument.Load(@"../../../../Web.xml");
 XNamespace _XNamesapce = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
 IEnumerable<XElement> values = from ele in webXMLResource .Descendants(_XNamesapce + "object")
                                select ele;

Hope it will work for you

查看更多
登录 后发表回答