xml - 当先前的节点值条件为真时获取 XML 节点值(不循环)

标签 xml vb.net linq-to-xml

示例 XML -

<?xml version="1.0"?>
<Root>
  <PhoneType dataType="string">
    <Value>CELL</Value>
  </PhoneType>
  <PhonePrimaryYn dataType="string">
    <Value>Y</Value>
  </PhonePrimaryYn>
  <PhoneNumber dataType="string">
    <Value>555-555-5554</Value>
  </PhoneNumber>
  <PhonePrimaryYn dataType="string">
    <Value>Y</Value>
  </PhonePrimaryYn>
  <PhoneType dataType="string">
    <Value>HOME</Value>
  </PhoneType>
  <PhoneNumber dataType="string">
    <Value>555-555-5555</Value>
  </PhoneNumber>    
</Root>

如果不遍历每个节点列表,有人可以告诉我(使用 LINQ-to-XML 或其他方式)我如何执行以下操作吗?

在 XML 示例中,您会看到两组“PhoneType”、“PhonePrimaryYn”和“PhoneNumber”类型代码组。第一组三个相互关联。第二组三个也相互关联,依此类推。

假设我想知道手机号码是多少。

当“PhoneType”“Value”为“CELL”,“PhonePrimaryYn”“Value”为“Y”时,我得到手机号码,我得到“PhoneNumber”“Value”为“555-555-5554” '.你很有希望得到这个想法。

我想知道是否有可能在不必遍历特定类型的每个节点列表组的情况下获得“PhoneNumber”值(例如手机)。

有没有人有什么想法?

最佳答案

更新

使用 XDocument 与 XmlDocument,我相信这可以在不使用循环的情况下满足您的要求。

这取决于元素的顺序

<PhoneType> <PhonePrimaryYN> <PhoneNumber>

string xml = "<?xml version=\"1.0\"?>" +
    "<Root>" + 
    "  <PhoneType dataType=\"string\">" + 
    "    <Value>CELL</Value>" + 
    "  </PhoneType>" + 
    "  <PhonePrimaryYn dataType=\"string\">" + 
    "    <Value>Y</Value>" + 
    "  </PhonePrimaryYn>" + 
    "  <PhoneNumber dataType=\"string\">" + 
    "    <Value>555-555-5554</Value>" + 
    "  </PhoneNumber>" + 
    "  <PhonePrimaryYn dataType=\"string\">" + 
    "    <Value>Y</Value>" + 
    "  </PhonePrimaryYn>" + 
    "  <PhoneType dataType=\"string\">" + 
    "    <Value>HOME</Value>" + 
    "  </PhoneType>" + 
    "  <PhoneNumber dataType=\"string\">" + 
    "    <Value>555-555-5555</Value>" + 
    "  </PhoneNumber>    " +
    "  <PhoneType dataType=\"string\">" +
    "    <Value>CELL</Value>" +
    "  </PhoneType>" +
    "  <PhonePrimaryYn dataType=\"string\">" +
    "    <Value>Y</Value>" +
    "  </PhonePrimaryYn>" +
    "  <PhoneNumber dataType=\"string\">" +
    "    <Value>555-555-9999</Value>" +
    "  </PhoneNumber>" + 
    "</Root>";

XDocument xDoc = XDocument.Parse(xml);
if (xDoc.Root != null)
{
    var tmp = (from item in xDoc.Root.Descendants()
                where item.Name == "PhoneType" && item.Value == "CELL"
                select new
                            {
                                PhoneNumber = item.NextNode.NextNode
                            }).ToList();

    for (int i = 0; i < tmp.Count; i++)
    {
        Console.WriteLine(((XElement)tmp[i].PhoneNumber).Value);
    }
}

结果:

555-555-5554
555-555-9999

旧答案

当我将您的示例 XML 加载到 XmlDocument 中时我看到它是 InnerText属性包含以下内容:

CELLY555-555-5554YHOME555-555-5555

从这里开始,我认为 Regex 是使用模式提取 CELL 数字的好方法:

"CELL[NY](\\d{3}-\\d{3}-\\d{4})"

该模式查找单词“CELL”,后跟“N”或“Y”,然后是格式为 ###-###-##### 的电话号码。 .电话号码在捕获组中,如果找到匹配项,则可以像下面的示例所示那样访问它。

我添加了另一个 CELL 条目以显示您可以在 XML 中获取所有 CELL 编号。所以 InnerText XmlDocument 的属性(property), 现在看起来像

CELLY555-555-5554YHOME555-555-5555CELLY555-555-9999

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml("<?xml version=\"1.0\"?>" +
    "<Root>" + 
    "  <PhoneType dataType=\"string\">" + 
    "    <Value>CELL</Value>" + 
    "  </PhoneType>" + 
    "  <PhonePrimaryYn dataType=\"string\">" + 
    "    <Value>Y</Value>" + 
    "  </PhonePrimaryYn>" + 
    "  <PhoneNumber dataType=\"string\">" + 
    "    <Value>555-555-5554</Value>" + 
    "  </PhoneNumber>" + 
    "  <PhonePrimaryYn dataType=\"string\">" + 
    "    <Value>Y</Value>" + 
    "  </PhonePrimaryYn>" + 
    "  <PhoneType dataType=\"string\">" + 
    "    <Value>HOME</Value>" + 
    "  </PhoneType>" + 
    "  <PhoneNumber dataType=\"string\">" + 
    "    <Value>555-555-5555</Value>" + 
    "  </PhoneNumber>    " +
    "  <PhoneType dataType=\"string\">" +
    "    <Value>CELL</Value>" +
    "  </PhoneType>" +
    "  <PhonePrimaryYn dataType=\"string\">" +
    "    <Value>Y</Value>" +
    "  </PhonePrimaryYn>" +
    "  <PhoneNumber dataType=\"string\">" +
    "    <Value>555-555-9999</Value>" +
    "  </PhoneNumber>" + 
    "</Root>");

Match match = Regex.Match(xmlDocument.InnerText, "CELL[NY](\\d{3}-\\d{3}-\\d{4})");
while (match.Success)
{
    Console.WriteLine(match.Groups[1]);
    match = match.NextMatch();
}

结果:

555-555-5554
555-555-9999

关于xml - 当先前的节点值条件为真时获取 XML 节点值(不循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30984705/

相关文章:

c# - 如何通过 post 将 xml 发送到 wcf 服务

.net - 有什么简单的方法可以使 VB.Net TextBox 中的滚动条仅在需要时显示?

c# - X文档遍历

vb.net - 取消关闭时如何重置关闭原因

c# - 与 LINQ-to-XML 中的 InnerText 等效的是什么?

vb.net - 合并两个 XElement

android - match_parent 并且未按预期填充 - Android/XML

java - 在哪里可以找到处理目录文件的 jaxb gradle 插件或自定义任务?

xml - 使用 XML namespace 前缀和将 xmlns ="blah"指定为属性之间的区别

vb.net - 从其他类 .net 访问控件