【问题标题】:getting data from XML using asp.net Vb.net使用 asp.net Vb.net 从 XML 获取数据
【发布时间】:2012-02-03 12:17:04
【问题描述】:

我有一个这样的 XML 文档:

<?xml version='1.0' encoding='UTF-8'?>
<GateDocument>
<!-- The document's features-->
<GateDocumentFeatures>
<Feature>
  <Name className="java.lang.String">MimeType</Name>
  <Value className="java.lang.String">text/html</Value>
</Feature>
</GateDocumentFeatures>

<!-- The document content area with serialized nodes -->

<TextWithNodes><Node id="0" />astralis<Node id="8" /> <Node id="9" />ltd<Node id="12" />
<Node id="14" />{<Node id="15" />DOCUMENT<Node id="23" />}<Node id="24" /> <Node id="25" />{<Node id="26" />TYPE<Node id="30" />}<Node id="31" />EX-<Node id="34" />10<Node id="36" />.<Node id="37" />12<Node id="39" /> <Node id="40" />{<Node id="41" />SEQUENCE<Node id="49" />}<Node id="50" />3<Node id="51" /> <Node id="52" />{<Node id="53" />FILENAME<Node id="61" />}<Node id="62" />e<Node id="63" />300201<Node id="69" />_<Node id="70" />ex<Node id="72" />10<Node id="74" />-<Node id="75" />12<Node id="77" />.<Node id="78" />txt<Node id="81" /> <Node id="82" />{<Node id="83" />DESCRIPTION<Node id="94" />}<Node id="95" />
</TextWithNodes>

<Annotations>
.
.
.
.
.
</Annotations>

<Annotations Name="Original markups">
.
.
.
.
</Annotations>

</GateDocument>

我已经使用 vb.net/asp.net 在 XMLDocument 中加载了这个 XML。我需要 id > 16 和 Id

   Dim sb As New StringBuilder()
            Dim document As New XPathDocument(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/gate_xml_output.xml"))
            Dim navigator As XPathNavigator = document.CreateNavigator()
            Dim iterator As XPathNodeIterator = navigator.Select("//TextWithNodes/node()[preceding-sibling::Node[@id=" & startNode & "] and following-sibling::Node[@id=" & endNode & "]]")


            While iterator.MoveNext()
                sb.Append(iterator.Current.Value & " ")
            End While

可能我需要修改以下代码:

XDocument doc = XDocument.Parse(@"<TextWithNodes>...</TextWithNodes");

string result = string.Join(" ",
    doc.Root
       .Nodes()
       .SkipWhile(n => n.NodeType != XmlNodeType.Element ||
                       (int)((XElement)n).Attribute("id") != 16)
       .TakeWhile(n => n.NodeType != XmlNodeType.Element ||
                       (int)((XElement)n).Attribute("id") != 30)
       .OfType<XText>());

// result == "pet DOCUMENT"

我需要提供给 XDocument.Parse 的内容。

请提出建议。

【问题讨论】:

  • 您有什么理由不使用 linq to xml?
  • 我想用它。实际上最后一个解决方案是在 linq to XML 中,但需要对其进行修改。请建议 LINQ to XML 解决方案。我更喜欢那个。
  • @linkerro 这只是一个范围。您可以使用任何其他号码。谢谢。急需帮助

标签: c# asp.net xml vb.net


【解决方案1】:

我使用的范围是 15 到 30

  XDocument xml = XDocument.Load("file.xml");
  var firstElement = xml.Descendants().Where(x => x.Name == "Node" && x.Attribute("id").Value=="15").FirstOrDefault();
  var lastElement = xml.Descendants().Where(x => x.Name == "Node" && x.Attribute("id").Value == "30").FirstOrDefault();
  var response = firstElement.NodesAfterSelf().Where(x => lastElement.NodesBeforeSelf().Contains(x));

这将返回元素。可以通过 ToString() 获取内容

【讨论】:

  • 是否需要使用 response.tostring 来获取节点元素之间的内容?
  • 查询返回位于 id 为 15 和 30(不包括)的节点之间的所有节点。如果您想要确切的字符串内容,请在查询中添加 Select(x=>x.ToString()) 并连接字符串。
  • @inkerro:我试过这个: Dim response = firstElement.NodesAfterSelf().Where(Function(x) lastElement.NodesBeforeSelf().Contains(x)).Select(x >= x.ToString ) 但它给出了错误。
  • 暗淡响应 = firstElement.NodesAfterSelf().Where(Function(x) lastElement.NodesBeforeSelf().Contains(x)).Select(function(x)x.ToString)
【解决方案2】:

我想你说的是如何使用XDocument.Parse

因为从外观上看,您的 XML 在外部文件中,所以最好使用

XDocument doc = XDocument.Load("myXmlFile.xml");

然后继续作为 LINQ to XML 的示例。如有误解请见谅

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2013-08-23
    • 1970-01-01
    • 2014-02-21
    • 2022-01-14
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多