2

我正在使用HtmlAgilityPack为了从谷歌翻译中刮取信息用于翻译程序。我已经下载了HtmlAgilityPackdll,并在我的程序中成功引用了它。我在 Unity 中使用 Assembly。下面是我的两个程序的代码:

using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using HtmlAgilityPack;

public class GUIScript : MonoBehaviour {
    private string textField = "";
    private string input;
    public Texture2D icon;
    Dictionary search;
    Encoding code;
    // Use this for initialization
    void Start () { 
        search = new Dictionary();
        input = " ";
        code = Encoding.UTF8;
        //This is what is run to translate
        print (search.Translate("Hola","es|en",code));
    }

    // Update is called once per frame
    void Update () {

    }
    void OnGUI(){
        textField = GUI.TextField(new Rect(0, Screen.height -50, Screen.width-80, 40), textField);
        if(GUI.Button(new Rect(Screen.width-80, Screen.height -50, 80,40), icon)){
            input = textField;
            textField = "";

        }
        //GUI.Label(new Rect(0,Screen.height -70, Screen.width-80,20), search.Translate("Hola","es|en",code));
        //print (search.Translate("Hola","es|en",code));
    }
}

这是引用我的Dictionary类的代码,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using System.Collections;
using System.Net;
using HtmlAgilityPack;


public class Dictionary{
    string[] formatParams;
    HtmlDocument doc;
    public Dictionary(){
        formatParams = new string[2];
        doc = new HtmlDocument();
    }
    public string Translate(String input, String languagePair, Encoding encoding)
     {
        formatParams[0]= input;
        formatParams[1]= languagePair;
        string url = String.Format("http://www.google.com/translate_t?hl=en&ie=UTF8&text={0}&langpair={1}", formatParams);

        string result = String.Empty;

        using (WebClient webClient = new WebClient())
        {
            webClient.Encoding = encoding;
            result = webClient.DownloadString(url);
        }       
        doc.LoadHtml(result);
        return doc.DocumentNode.SelectSingleNode("//span[@title=input]").InnerText;
    }
    // Use this for initialization
    void Start () {

    }
}

运行此程序时,我收到错误:

NullReferenceException: Object reference not set to an instance of an object
Dictionary.Translate (System.String input, System.String languagePair,System.Text.Encoding encoding) (at Assets/Dictionary.cs:32)
GUIScript.Start () (at Assets/GUIScript.cs:22)

我已经尝试更改代码、查找解决方案、APIHtmlDocument以及如何修复NullReferenceExceptions,但由于某种原因,我无法弄清楚为什么我会得到一个NullReferenceException. 这个问题已经阻碍了我一两个星期,我需要继续我的项目。任何帮助将不胜感激!

4

2 回答 2

2

如果我计算正确,这是第 32 行:

return doc.DocumentNode.SelectSingleNode("//span[@title=input]").InnerText

这意味着要么doc.DocumentNode为空,要么DocumentNode.SelectSingleNode("//span[@title=input]")返回空。

如果是前者,请检查您是否收到了实际文档。您的 URL 可能未正确编码。另请参阅为什么 HTML Agility Pack HtmlDocument.DocumentNode 为空?

如果是后者,那么 XPath 可能会发生一些奇怪的事情。我不知道这DocumentNode应该是文档的根目录有多相关, http ://htmlagilitypack.codeplex.com/discussions/249129 上的讨论可能适用。据此,'//' 是从文档的根目录搜索,您可能不得不尝试(在字符串的开头doc.DocumentNode.SelectSingleNode(".//span[@title=input]")添加 a )。.

调试方法并准确查看这些调用的值将完成这项工作。

于 2012-10-23T13:53:58.863 回答
0

你想找回什么?我打开了您正在使用的 url 并做了一个简单的查找title=input并没有返回任何内容。我猜你正在寻找 Hola 的翻译,你好?

如果是这样,我在控制台应用程序中这样做了。希望这可以帮助。

    static void Main(string[] args)
    {
        string Input = "Hola";
        HtmlWeb web = new HtmlWeb();
        HtmlDocument doc = web.Load("http://www.google.com/translate_t?hl=en&ie=UTF8&text=Hola&langpair=es|en");

        string definition = doc.DocumentNode.SelectSingleNode(string.Format("//span[@title='{0}']",Input)).InnerText;
        Console.WriteLine(definition);
        Console.ReadKey();
    }

编辑:刚刚意识到你不是在寻找title=input但是title=Hola. 正如您在我的代码中看到的那样,请尝试String.Format(("//span[@title='{0}']",Input). 这会将变量的文本插入Input到字符串行中。

于 2012-10-24T21:08:06.330 回答