1

我需要一些帮助来阅读格式奇特的 XML 文件。由于节点和属性的结构方式,我不断遇到 XMLException 错误(至少,这是输出窗口告诉我的;我的断点拒绝触发以便我可以检查它)。无论如何,这是 XML。以前有人经历过这样的事情吗?

<ApplicationMonitoring>
<MonitoredApps>
        <Application>
            <function1 listenPort="5000"/>
        </Application>
        <Application>
            <function2 listenPort="6000"/>
        </Application>
</MonitoredApps>
<MIBs>
    <site1 location="test.mib"/>
</MIBs> 
<Community value="public"/>
<proxyAgent listenPort="161" timeOut="2"/>
</ApplicationMonitoring>

干杯

编辑:解析代码的当前版本(文件路径缩短 - 我实际上并没有使用这个):

XmlDocument xml = new XmlDocument();
xml.LoadXml(@"..\..\..\ApplicationMonitoring.xml");

string port = xml.DocumentElement["proxyAgent"].InnerText;
4

3 回答 3

1

您在加载 XML 时遇到的问题是xml.LoadXml希望您将 xml 文档作为字符串而不是文件引用传递。

尝试使用:

xml.Load(@"..\..\..\ApplicationMonitoring.xml");

基本上在您的原始代码中,您告诉它您的 xml 文档是

..\..\..\ApplicationMonitoring.xml

而且我相信您现在可以看到为什么会出现解析异常。:) 我已经用您的 xml 文档和修改后的负载对此进行了测试,它工作正常(除了 Only Bolivian Here 指出的问题,即您的内部 Text 不会返回任何内容。

为了完整起见,您可能想要:

XmlDocument xml = new XmlDocument();
xml.Load(@"..\..\..\ApplicationMonitoring.xml");
string port = xml.DocumentElement["proxyAgent"].Attributes["listenPort"].Value;
//And to get stuff more specifically in the tree something like this
string function1 = xml.SelectSingleNode("//function1").Attributes["listenPort"].Value;

请注意在属性上使用 Value 属性,而不是 ToString 方法,它不会做你所期望的。

究竟如何从 xml 中提取数据可能取决于您正在使用它做什么。例如,您可能希望通过执行此操作获取应用程序节点列表以使用 foreach 进行枚举xml.SelectNodes("//Application")

如果您在提取内容时遇到问题,但这可能是另一个问题的范围,因为这只是关于如何加载 XML 文档。

于 2012-07-25T15:44:45.030 回答
0
xml.DocumentElement["proxyAgent"].InnerText;

proxyAgent 元素是自动关闭的。InnerText 将返回 XML 元素内部的字符串,在这种情况下,没有内部元素。

您需要访问元素的属性,而不是 InnerText。

于 2012-07-25T15:37:53.013 回答
0

试试这个:

string port = xml.GetElementsByTagName("ProxyAgent")[0].Attributes["listenPort"].ToString();

或者使用 Linq to XML:

http://msdn.microsoft.com/en-us/library/bb387098.aspx

而且...您的 XML 没有格式错误...

于 2012-07-25T15:48:32.887 回答