لماذا طلب كسباث جهدي لملف XML على شبكة الإنترنت لا يعمل؟

StackOverflow https://stackoverflow.com/questions/1805292

سؤال

وهناك ملف XML مع أسعار الصرف HTTP: // شبكة الاتصالات العالمية .ecb.europa.eu / احصائيات / eurofxref / eurofxref-daily.xml :

<gesmes:Envelope>
  <gesmes:subject>Reference rates</gesmes:subject>
  <gesmes:Sender>
    <gesmes:name>European Central Bank</gesmes:name>
  </gesmes:Sender>
  <Cube>
    <Cube time="2009-11-26">
      <Cube currency="USD" rate="1.5071"/>
       ...

وأفعل طلب كسباث المقبل:

var doc = new XmlDocument();
doc.Load(url);
var node = doc.SelectSingleNode("//Cube[@currency=\"USD\""]);
var value = node.Attributes["rate"].Value;

ولكن ذلك يعود null! أين هو خطأي؟

وإذا كنت تفعل هذا الطلب، كل يعمل بشكل جيد:

var node = dic.SelectSingleNode("//*[@currency=\"USD\"]");
var name = node.Name; // "Cube"
هل كانت مفيدة؟

المحلول

وحاول

var node = doc.SelectSingleNode("//*[local-name()='Cube' and @currency=\"USD\""]);

ويمكنك دائما إضافة في مساحة الاسم إذا كنت تعرف أنه

var node = doc.SelectSingleNode("//*[local-name()='Cube' and 
     namespace-uri()='http://www.ecb.int/vocabulary/2002-08-01/eurofxref' and
     @currency=\"USD\""]);

وعلى الرغم من أنه عمل متعب أنا أفضل أن تحاول فرز البادئات مساحة الاسم. ويتجنب أيضا مشكلة مساحة الاسم (xmlns="") الافتراضي

نصائح أخرى

والمشكلة تكمن في مساحة الاسم. إذا كان يمكنك استخدام LINQ إلى XML، يمكنك التعبير عن هذا الاستعلام بسهولة تامة. وإلا، فإنه اصعب قليلا - كنت تريد شيئا من هذا القبيل:

var doc = new XmlDocument();
doc.Load(url);
XPathNavigator navigator = doc.CreateNavigator();    
XmlNamespaceManager nsMgr = new XmlNamespaceManager(nav.NameTable);
nsMgr.AddNamespace("gesmes", "http://www.gesmes.org/xml/2002-08-01");
nsMgr.AddNamespace("ns0", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref");

var node = doc.SelectSingleNode("//ns0:Cube[@currency=\"USD\""], nsMgr);
var value = node.Attributes["rate"].Value;

و(لا حقا <م> الحاجة مساحة الاسم gesmes في إدارة هناك، لكنه سوف تجعل من الأسهل إذا كنت في حاجة للبحث عن أي عناصر أخرى).

وتحرير: الجواب بيتر موراي الصدأ هو بديل لطيف هنا - النهج الذي كنت تأخذ هذا يتوقف على كيفية معينة كنت تريد أن تكون قادرة على عنصر في العثور عليها. إذا كنت بحاجة فقط مساحة الاسم للاستعلام واحد، فمن المنطقي أن تتضمن URI مباشرة في كسباث. إذا كنت بحاجة لأكثر من ذلك، ستحصل على استفسارات أكثر إيجازا باستخدام إدارة مساحة الاسم.

XPathVisualizer يمكن أن تكون في متناول اليد. انه مجانا. لن يكون قال لك لاستخدام مساحة الاسم، ولكنه كان قد وضع مساحة الاسم أمامك في واجهة المستخدم، وسيكون havve تمكنك من اختبار مجموعة من البدائل، وبسرعة حقا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top