[英]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.