2

私の質問の目標は、aspx ページを介してユーザーから XML ファイルの URL とキーワード (ノードの名前) を取得することです。

  1. ノードに値がある場合は、値を出力します。
  2. ノードに子要素がある場合は、子要素のセットを出力します。
  3. ノードがリーフ ノードの場合、親ノードを出力します。

私の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 += "&lt;" + child.Name + "&gt;";
            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";
    }

}

4

1 に答える 1

0
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];
    //result = node.LocalName + " - - " + node.Name + " - - " + node.NodeType + " - - " + node.OuterXml;
    //return result;    
    //foreach (XmlNode node in nodes){
    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 += "&lt;" + child.Name + "&gt;";
            return str;
        }
        else if ( node.OuterXml!=null && node.InnerText.ToString() != String.Empty) 
        {
            return node.InnerText.ToString();
        }
        /*else if (node.OuterXml != "" && node.Value != null)
        {
            string result;
            result = node.LocalName + " - - " + node.Name + " - - " + node.NodeType + " - - " + node.OuterXml;
            return result;
        }*/
        else if (node.ParentNode != null)
            return node.ParentNode.Name;
        else
            return node.Name;

        /*
        if (node.OuterXml != "")
        {
            if (node.HasChildNodes && node.FirstChild.Name != "#text")
            {
                XmlNodeList childern = node.ChildNodes;
                string str = "Child Nodes are:-";
                foreach (XmlNode child in childern)
                    str += "&lt;" + child.Name + "&gt;";
                return str;
            }
            else
            {
                if (node.OuterXml == string.Empty)
                    return node.ParentNode.Name;
                else
                    return node.OuterXml;
                //return "Outer Xml null part";
                //return node.OuterXml;
            }
        }
        else
        {
            //return "Outer Xml null part";
            //string result;
            // = node.LocalName + " - - " + node.Name + " - - " + node.NodeType + " - - " + node.OuterXml;
            //return result;
            if (node.ParentNode != null)
            {
                string str = "Parent Node is :-";
                str += node.ParentNode.Name.ToString();
                return str;
            }
            else
                return node.Name;
            //return node.OuterXml;
        }
    */
    }
    catch(Exception e)
    {
        return "Error Occured : Try Again with New Input Set";
    }
}
于 2013-11-15T02:53:32.600 に答える