2011-12-16 2 views
1

Что мне нужно получить строковое представление фрагмента xml для элемента HB_Base. Может ли кто-нибудь указать на это наилучшим образом.Извлечь фрагмент xml в C#

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> 
    <s:Header> 
    <a:Action s:mustUnderstand="1">http://www.as.com/ver/ver.IClaimver/Car</a:Action> 
    <a:MessageID>urn:uuid:b22149b6-2e70-46aa-8b01-c2841c70c1c7</a:MessageID> 
    <ActivityId CorrelationId="16b385f3-34bd-45ff-ad13-8652baeaeb8a" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">04eb5b59-cd42-47c6-a946-d840a6cde42b</ActivityId> 
    <a:ReplyTo> 
     <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
    </a:ReplyTo> 
    <a:To s:mustUnderstand="1">http://localhost/ver.Web/ver2011.svc</a:To> 
    </s:Header> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Car xmlns="http://www.as.com/ver"> 
     <carApplication> 
     <HB_Base xsi:type="HB" xmlns="urn:core"> 
      <Header> 
      <Advisor> 
       <AdvisorLocalAuthorityCode>11</AdvisorLocalAuthorityCode> 
       <AdvisorType>1</AdvisorType> 
      </Advisor> 
      </Header> 
      <General> 
      <ApplyForHB>yes</ApplyForHB> 
      <ApplyForCTB>yes</ApplyForCTB> 
      <ApplyForFSL>yes</ApplyForFSL> 
      <ConsentSupplied>no</ConsentSupplied> 
      <SupportingDocumentsSupplied>no</SupportingDocumentsSupplied> 
      </General> 
     </HB_Base> 
     </carApplication> 
    </Car> 
    </s:Body> 
</s:Envelope> 

Update

Как использовать XmlDocument.SelectSingleNode(), который использует XmlNamespaceManager. Потому что было бы лучше использовать xpath, например "/Envelope/Body/Car/carApplication/HB_Base"

+0

Как вы читаете XML. В самом деле, ответ больше связан с тем, какой XML-синтаксический анализ вы используете, чем сам XML. –

ответ

1

Вы должны указать пространство имен, using XLinq we'd use an XNamespace, чтобы помочь сделать XName, которая относится к элементам:

var xdoc = XDocument.Load(xmlFile); // or .Parse(@"....") 

XNamespace ns = @"urn:core"; 
// This is where the magic happens: ns + "HB_Base" 
var hbBase = xdoc.Root.Descendants(ns + "HB_Base") 
         .SingleOrDefault(); 

if (hbBase == null) throw new InvalidOperationException("No such element"); 

var xml = hbBase.ToString(); 

Использование XmlDocument and XmlNamespaceManager вместо:

var xmlDoc = new XmlDocument(); 
xmlDoc.Load(xmlFile); 

var nsManager = new XmlNamespaceManager(xmlDoc.NameTable); 
nsManager.AddNamespace("s", @"http://www.w3.org/2003/05/soap-envelope"); 
nsManager.AddNamespace("c", @"http://www.as.com/ver"); 
nsManager.AddNamespace("h", @"urn:core"); 

var hbBase = xmlDoc.SelectSingleNode(
    @"/s:Envelope/s:Body/c:Car/c:carApplication/h:HB_Base"); 
if (hbBase == null) throw new InvalidOperationException("No such element"); 

var xml = hbBase.OuterXml; 
+0

Спасибо, ваш ответ работает. – Pingpong

+0

Как использовать XmlDocument.SelectSingleNode(), который использует XmlNamespaceManager. Потому что лучше использовать xpath, например «/ Envelope/Body/Car/carApplication/HB_Base». – Pingpong

+0

Благодарим вас за быстрый ответ. Очень ценится. У меня есть вопрос. Из XML-файла SOAP элемент Car и HB_Base используют одно и то же пространство имен по умолчанию? Из вашего нового кода, nsManager.AddNamespace («c», @ «urn: core»); Означает ли это, что мы определяем собственный префикс пространства имен 'c'? – Pingpong

0

Загрузите его в документ xml и выберите свой узел, затем извлеките текст. Это может не скомпилировать.

XmlDocument doc = new XmlDocument(); 
doc.loadXml(theString); 
doc.SelectSingleNode("/Envelope/Body/Car/carApplication/HB_Base").OuterXml; 
+0

Ему понадобится применить пространство имен «urn: core» к этому элементу. – user7116

1

Моя рекомендация состоит в том, чтобы использовать LINQ to XML :

using System.Linq; 
using System.Xml.Linq; // requires a reference to System.Xml.Linq.dll 

// . . . 

// Load the XML (in this example, we use a file) 
XDocument document = XDocument.Load("yourfile.xml"); 

// Initialize the namespace for the target element 
XNamespace coreNamespace = "urn:core"; 

// Choose the first element below the root matching our target element 
// (or return null if there is none) 
XElement chosenElement = document.Root.Descendants(coreNamespace + "HB_Base").FirstOrDefault(); 

string xmlString = null; 
if (chosenElement != null) 
{ 
    // We found it, now get the string representation of the XML 
    xmlString = chosenElement.ToString(); 
} 
+0

Спасибо, ваш ответ работает. – Pingpong

Смежные вопросы