Чтение XElement с несколькими пространствами имен;определить, какие пространства имен используются - PullRequest
0 голосов
/ 21 мая 2019

У меня есть 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.

Если я заранее знаю используемые пространства имен, я могу сделать что-то вроде: , как предложено в этом вопросе 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?

1 Ответ

0 голосов
/ 21 мая 2019

Вы можете спросить 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");
...