2012-01-05 11 views
-1

私の以前の質問では、私の問題を解決する方法を理解できませんでした。名前空間を持つXMLからLinqを使ってXMLにデータをロードしてアクセスする方法

<root> 
     <photo>/filesphoto.jpg</photo> 
     <photo:mtime>12</photo:mtime> 
     <text>some text</text> 
</root> 

を、私はこのコードを使用して要素にアクセスするには:ここで Linq to XML, how to acess an element in C#? は、私が解析する必要が私のXMLである

var doc = XDocument.Parse(xml.Text); 
doc.Descendants("text").FirstOrDefault().Value; 

はどうやってアクセスすることができますか? 私は試しましたhttp://aspnetgotyou.blogspot.com/2010/06/xdocument-or-xelement-with-xmlnamespace.html、 それは無視されます<photo:mtime>と私はそれにアクセスする必要があります。 コードを記入してください。

+3

xmlであれば、LinqとXmlで解析することはできません。XMLを修正する必要があります。また、以前の質問への回答を参照してください。 – BrokenGlass

+0

XMLは正しくないため、解析できません。それが問題なければ、このXMLファイルをVSで開き、 'photo:mtime>'を 'photoMtime>'に置き換えることをお勧めします。 –

答えて

0

@BrokenGlassのコメントとは異なり、あなたのXMLは無効ではありません。実際、あなたが(名前空間をロードするために)あなたの質問で提供したリンクのテクニックはうまくいきます。たぶん、自分のニーズに合わせて例を変更していないだけかもしれません。

string xml = 
@"<root> 
    <photo>/filesphoto.jpg</photo> 
    <photo:mtime>12</photo:mtime> 
    <text>some text</text> 
</root>"; 
XElement x = parseWithNamespaces(xml, new string[] { "photo" }); 
foreach (XElement e in x.Elements()) { 
    Console.WriteLine("{0} = {1}", e.Name, e.Value); 
} 
Console.WriteLine(x.Element("{photo}mtime").Value); 

プリント:

photo = /filesphoto.jpg 
{photo}mtime = 12 
text = some text 
12 
+0

メソッドを適用した後、 2 ' 12' '{{写真} –

0

はこれを試してください:あなたの正確な入力を使用して

public static XElement parseWithNamespaces(String xml, String[] namespaces) { 
    XmlNamespaceManager nameSpaceManager = new XmlNamespaceManager(new NameTable()); 
    foreach (String ns in namespaces) { nameSpaceManager.AddNamespace(ns, ns); } 
    return XElement.Load(new XmlTextReader(xml, XmlNodeType.Element, 
     new XmlParserContext(null, nameSpaceManager, null, XmlSpace.None))); 
} 

:ここでのXElementに名前空間とXMLフラグメントを解析するためのよりコンパクトな一般化です(あなたのxmlは少し変更されます)、

string xml = "<root><photo>/filesphoto.jpg</photo><photoMtime>12</photoMtime><text>some text</text></root>"; 
var doc = XDocument.Parse(xml); 
string value = doc.Descendants("text").FirstOrDefault().Value; 
MessageBox.Show(value); 
関連する問題