簡體   English   中英

無法使用命名空間獲取 XML 中的元素

[英]Unable to get element in XML with namespace

<?xml version=""1.0"" encoding=""UTF-8""?>
<serv:message
    xmlns:serv=""http://www.webex.com/schemas/2002/06/service""
    xmlns:com=""http://www.webex.com/schemas/2002/06/common""
    xmlns:sess=""http://www.webex.com/schemas/2002/06/service/session""
    xmlns:train=""http://www.webex.com/schemas/2002/06/service/trainingsession""
    xmlns:qti=""http://www.webex.com/schemas/2002/06/service/trainingsessionqti""
    xmlns:qtiasi=""http://www.webex.com/schemas/2002/06/service/trainingsessionqtiasi"">
    <serv:header>
        <serv:response>
            <serv:result>SUCCESS</serv:result>
            <serv:gsbStatus>PRIMARY</serv:gsbStatus>
        </serv:response>
    </serv:header>
    <serv:body>
        <serv:bodyContent xsi:type=""train:getTrainingSessionResponse""
            xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">
            <sess:accessControl>                
                <sess:sessionPassword>12345678</sess:sessionPassword> 
            </sess:accessControl>           
            <train:telephony>
                <sess:telephonySupport>NONE</sess:telephonySupport>
            </train:telephony>          
            <train:repeat>              
                <train:occurenceType>NO_REPEAT</train:occurenceType>
            </train:repeat>
            <train:attendees>
                <sess:participants>
                    <sess:participant>
                        <sess:person>
                            <com:name>Test User</com:name>
                            <com:firstName>Test</com:firstName>
                            <com:lastName>User</com:lastName>
                            <com:address>
                                <com:addressType>PERSONAL</com:addressType>
                            </com:address>
                            <com:phones/>
                            <com:email>testuser@test.com</com:email>
                            <com:type>VISITOR</com:type>
                        </sess:person>
                        <sess:contactID>1234567980</sess:contactID>
                        <sess:joinStatus>INVITE</sess:joinStatus>
                        <sess:role>ATTENDEE</sess:role>
                    </sess:participant>
                </sess:participants>
            </train:attendees>          
        </serv:bodyContent>
    </serv:body>
</serv:message>

以上 XML 是標准的 WebEx GetEvent XML,我需要處理。 我已將所有名稱空間添加到我的名稱空間管理器中,但仍然無法讀取任何標簽。 請參見下面的示例代碼:

            private XmlNamespaceManager GetNameSpace(XmlNameTable objNameTable)
            {
                XmlNamespaceManager objNsManager = new XmlNamespaceManager(objNameTable);
                objNsManager.AddNamespace("serv", "http://www.webex.com/schemas/2002/06/service");
                objNsManager.AddNamespace("ns1", "http://www.webex.com/schemas/2002/06/service/site");
                objNsManager.AddNamespace("body", "http://www.webex.com/schemas/2002/06/service/training");
                objNsManager.AddNamespace("sess", "http://www.webex.com/schemas/2002/06/session");
                objNsManager.AddNamespace("train", "http://www.webex.com/schemas/2002/06/service/trainingsession");
                objNsManager.AddNamespace("ep", "http://www.webex.com/schemas/2002/06/service/ep");
                objNsManager.AddNamespace("meet", "http://www.webex.com/schemas/2002/06/service/meeting");
                return objNsManager;
            }
    
    var sessionPasswordNodes = xmlDoc.SelectSingleNode("/serv:message/serv:body/serv:bodyContent/sess:accessControl/sess:sessionPassword", GetNameSpace(xmlDoc.NameTable));
    
    var attendeesNodes = xmlDoc.SelectSingleNode("/serv:message/serv:body/serv:bodyContent/train:attendees", GetNameSpace(xmlDoc.NameTable));

    var personsNode = attendeesNodes.SelectNodes("/serv:message/serv:body/serv::bodyContent/train:attendees/sess:participants/sess:participant/sess:person", GetNameSpace(xmlDoc.NameTable));

任何人都知道上面的代碼有什么問題,我怎樣才能讓它工作?

此外,如果您觀察到 XML 人員節點是參加者的子節點,並且假設我已經獲得了參加者節點,那么我如何才能訪問人員而不像現在這樣再次通過完整路徑?

不幸的是,由於某種原因我不能使用 LINQ,所以別無選擇,只能按照我嘗試的方式處理節點。

最好使用LINQ to XML API。

自 2007 年以來,它在 .Net Framework 中可用。

C#

void Main()
{
    const string filePath = @"e:\Temp\sunil20000.xml";
    XDocument xdoc = XDocument.Load(filePath);

    XNamespace sess = xdoc.Root.GetNamespaceOfPrefix("sess");
    XNamespace train = xdoc.Root.GetNamespaceOfPrefix("train");

    string sessionPassword = xdoc.Descendants(sess + "sessionPassword")
        .FirstOrDefault()?.Value;

    IEnumerable<XElement> attendees = xdoc.Descendants(train + "attendees");
    IEnumerable<XElement> person = attendees.Descendants(sess + "person");
}

嘗試 xml linq :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApplication23
{

    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XElement participants = doc.Descendants().Where(x => x.Name.LocalName == "participants").FirstOrDefault();
            XNamespace  nsSess = participants.GetNamespaceOfPrefix("sess");
            XNamespace nsCom = participants.GetNamespaceOfPrefix("com");

            var people = participants.Descendants(nsSess + "person").Select(x => new
            {
                name = (string)x.Element(nsCom + "name"),
                firstName = (string)x.Element(nsCom + "firstName"),
                lastName = (string)x.Element(nsCom + "lastName"),
                address = (string)x.Descendants(nsCom + "addressType").FirstOrDefault(),
                phones = (string)x.Element(nsCom + "phones"),
                email = (string)x.Element(nsCom + "email"),
                type = (string)x.Element(nsCom + "type")
            }).ToList();

        }
    }
 
}

如果您使用/啟動 XQuery,那么它會返回到根目錄。 所以只需刪除它。

var personsNode = attendeesNodes.SelectNodes("sess:participants/sess:participant/sess:person", GetNameSpace(xmlDoc.NameTable));

問題的根本原因是命名空間。 兩個不同的命名空間用於相同的前綴,所以我必須從 XmlNamespaceManager 添加/刪除。 關於我的其他問題,@charlieface 的建議對我來說效果很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM