У меня есть XML-документ, который использует несколько пространств имен:
<?xml version="1.0" encoding="utf-8" ?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ http://www.oasis-open.org/committees/ebxml-msg/schema/envelope.xsd"> <soap:Header xmlns:eb="http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd" xsi:schemaLocation="http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd"> <eb:MessageHeader eb:id="ID3305713901556098440508VCPEBV11" eb:version="2.0" soap:mustUnderstand="1"> <eb:Action>Pong</eb:Action> ...
Этот XML-файл использует несколько пространств имен: soap и eb.
soap
eb
Если я заранее знаю используемые пространства имен, я могу сделать что-то вроде: , как предложено в этом вопросе SO :
XNamespace nsSoap = "http://schemas.xmlsoap.org/soap/envelope/"; XNamespace nsEb = "http://www.oasis-open.org/committees/ebxml-msg/schema/msg-header-2_0.xsd"; XDocument xDoc = XDocument.Load(textReader); XElement xmlRoot = xDoc.Root; XElement header = xmlRoot.Element(nsSoap + "Header"); XElement messageHeader = header.Element(nsEb + "MessageHeader"); XElement action = messageHeader.Element(nsEb + "Action");
Но что, если я не знаюрасположение пространств имен заранее?
Я знаю, что они упоминаются в начале XElements, поэтому я собрал: могу ли я спросить XElement о пространствах имен, о которых он знает все?
И действительно, я могу спросить Заголовок о его пространстве имен:
var headerNameSpace = header.Name.Namespace;
Но тогда я получаю пространство имен soap.Как я могу определить, что этот заголовок определяет пространство имен eb?
Вы можете спросить XElement: знаете ли вы пространство имен для «eb»?
XDocument xDoc = XDocument.Load(textReader); XElement xmlRoot = xDoc.Root; // I want the XElement that starts with <soap:header .... // so I'll ask the XmlRoot if it know a namespace with prefix "soap" var nsSoap = xmlRoot.GetNameSpaceOfPrefix("soap"); XElement header = xmlRoot.Element(nsSoap + "Header"); // I want to read: <eb:MessageHeader ... var nsEb = header.GetNameSpaceOfPrefix("eb"); XElement messageHeader = header.Element(nsEb + "MessageHeader");