私の質問の目標は、aspx ページを介してユーザーから XML ファイルの URL とキーワード (ノードの名前) を取得することです。
- ノードに値がある場合は、値を出力します。
- ノードに子要素がある場合は、子要素のセットを出力します。
- ノードがリーフ ノードの場合、親ノードを出力します。
私のXMLファイル:-
<document-metadata xmlns="http://breeze.macromedia.com/" version="1.0">
<document-info>
<title>Harry Potter</title>
<summary/>
<author/>
<keywords/>
<thumbnail href="data/thumb/thumb_slide_000001.jpg"/>
<view-link href="/Viewer.swf?slide={position}"/>
</document-info>
<section xmlns="" type="slide" position="1">
<title>Part 1</title>
<content>XYZ</content>
<related-content/>
<thumbnail href="data/thumb/thumb_slide_000001.jpg"/>
</section>
<section xmlns="" type="slide" position="2">
<title>Part 2</title>
<content> PQRS</content>
<related-content/>
<thumbnail href="data/thumb/thumb_slide_000002.jpg"/>
</section>
</document-info>
</document-metadata>
私のC#コード:-
public string XmlNodeFind(string xmlUrl, string keyword)
{
XmlDocument xdoc = new XmlDocument();
xdoc.Load(xmlUrl);
try
{
XmlNodeList nodes = xdoc.GetElementsByTagName(keyword);
string result = "";
foreach (XmlNode node in nodes)
result = OutputNode(node);
return result;
}
catch(Exception e)
{
return "No Node Exists";
}
}
public string OutputNode(XmlNode node)
{
try
{
if (node.Value == null)
{
if (node.HasChildNodes)
{
XmlNodeList childern = node.ChildNodes;
string str = "";
foreach (XmlNode child in childern)
str = str + child.Name.ToString() + " <> ";
//OutputNode(child);
}
else if (node.ParentNode != null)
{
return node.ParentNode.Name.ToString();
}
else
{
return node.Name.ToString();
}
}
else
{
return node.Value.ToString();
}
}
catch(Exception e)
{
return "Error Occured";
}
return node.Value.ToString();
}
私のコードの問題は、aspx ページを介して XML とキーワードの URL を送信すると、出力が常に「ノードが存在しません」になることです。
キーワードに基づいてノードを抽出する投稿をいくつか読みましたが、以前は名前空間を確認するようにアドバイスされていました。しかし、私の XML ファイルは常に同じではありません。URL によって、ノードのチェックに使用される XML ファイルが変更されます。
これは私が修正した最終的なコードです:-
public string XmlNodeFind(string xmlUrl, string keyword)
{
XmlDocument xdoc = new XmlDocument();
xdoc.Load(xmlUrl);
XmlNodeList nodes = xdoc.GetElementsByTagName(keyword);
string result = "";
XmlNode node = nodes[0];
if (node != null)
{
result = OutputNode(node);
return result;
}
else
return "Node Does Not Exist !!! Try with a Valid Node.";
}
public string OutputNode(XmlNode node)
{
try
{
if (node.HasChildNodes && node.FirstChild.Name != "#text")
{
XmlNodeList childern = node.ChildNodes;
string str = "Child Nodes are:-";
foreach (XmlNode child in childern)
str += "<" + child.Name + ">";
return str;
}
else if ( node.OuterXml!=null && node.InnerText.ToString() != String.Empty)
return node.InnerText.ToString();
else if (node.ParentNode != null)
return node.ParentNode.Name;
else
return node.Name;
}
catch(Exception e)
{
return "Error Occured : Try Again with New Input Set";
}
}